0

我有这个脚本复制目录

for dir in $(pwd)/*/
do
        dir=${dir%*/}
        dirsize=$(du -chk "${dir##*/}" | grep total)
        kbsize=${dirsize%total}
        if [[ "$kbsize" -lt 4194304 ]]
        then
                cp -rv * "$1"
        fi
done

我试图让它只复制低于 4GB 的目录(因为 FAT32 限制)。问题是它会复制所有内容,而不仅仅是超过 4GB 的目录。

我确信这很愚蠢,因为我的 BASH 知识不是很好。有任何想法吗?

4

2 回答 2

0

问题出在你的du命令上。运行此命令会产生:

$ du -chk .
# ...
18M     total

结果,您的kbsize变量包含18M. 并且bash不喜欢这样:

$  [[ 18M -lt 923898 ]]; echo $?
bash: [[: 18M: value too great for base (error token is "18M")
1

将您的命令替换为du -sk

$ kbsize=$(du -sk . | awk '{print $1}')
$ echo $kbsize
18196
$ [[ $kbsize -lt 4194304 ]]; echo $?
0 # Success!
$ [[ $kbsize -lt 10 ]]; echo $?
1 # Fails, but no errors
于 2013-01-14T19:35:11.080 回答
0

您的*cp 语句中的 正在扩展以包含pwd. 因此,如果任何目录小于 4gb,它将尝试复制每个目录。

我建议您使用该-t选项来cp指定应将文件复制到的目标目录,并从该命令中删除 *。

-s另外,正如其他人所提到的,请查看du.

于 2013-01-14T19:51:18.887 回答