我有这个脚本复制目录
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知识并不那么棒。有什么想法吗?
答案 0 :(得分: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
答案 1 :(得分:0)
正在扩展cp语句中的*
以包含pwd
中的所有目录名称。因此,如果任何目录低于4gb,它将尝试复制每个目录。
我建议您使用-t
选项cp
指定要复制文件的目标目录,并从该命令中删除*。
另外,正如其他人所提到的,请查看-s
的{{1}}选项。