如果内容总量低于4gb,则使用BASH复制文件夹

时间:2013-01-14 19:27:14

标签: macos bash terminal

我有这个脚本复制目录

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知识并不那么棒。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

问题在于您的du命令。运行此命令会产生:

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

因此,您的kbsize变量包含18Mbash不喜欢这样:

$  [[ 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

答案 1 :(得分:0)

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

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

另外,正如其他人所提到的,请查看-s的{​​{1}}选项。