使用'cp'处理空格

时间:2012-08-12 21:00:47

标签: bash

我有一个外部驱动器,上面有超过1TB的项目文件。我需要重新格式化这个驱动器,以便我可以重新组织它,但是在我这样做之前我需要转移所有内容。问题是我在Mac上并且驱动器被格式化为NTFS所以我所能做的就是复制它。我试图简单地只是复制并粘贴在Finder中,但驱动器似乎在大约15分钟的复制后锁定。所以我决定编写一个bash脚本来一次迭代所有1000多个文件。这似乎适用于没有空格但跳过它的文件。

到目前为止,这是我一直在攻击的内容..我在bash方面不是很先进,所以对你如何处理这些空间有任何建议。

quota=800
size=`du -sg /Users/work/Desktop/TEMP`
files="/Volumes/Lacie/EXR_files/*"

for file in $files
do
    if [[ ${size%%$'\t'*} -lt $quota ]];
    then
        echo still under quota;
        cp -v $file /Users/work/Desktop/TEMP_EXR;
        du -sg /Users/work/Desktop/TEMP_EXR;
    else
        echo over quota;
    fi
done

(我正在检查目录大小,因为在将所有临时副本全部复制到一个重新格式化的驱动器之前,我必须将此临时副本拆分到几个不同的位置。)

2 个答案:

答案 0 :(得分:5)

希望我不是误会。如果文件名中的空格字符有问题,引用。如果你想让bash扩展其中的参数,请使用双引号。

cp -v "$file" /Users/work/Desktop/TEMP_EXR

答案 1 :(得分:0)

您可以将所有文件名放在一个数组中,然后迭代它。

quota=800
size=`du -sg /Users/work/Desktop/TEMP`
files=( /Volumes/Lacie/EXR_files/* )

for file in "${files[@]}"
do
    if [[ ${size%%$'\t'*} -lt $quota ]];
    then
        echo still under quota;
        cp -v "$file" /Users/work/Desktop/TEMP_EXR;
        du -sg /Users/work/Desktop/TEMP_EXR;
    else
        echo over quota;
    fi
done

需要注意的两件事是:1)在for列表中引用数组扩展,2)为$file命令引用cp