在发布这个问题的过程中,我一直在试验我的代码,我已经想出了一些有用的东西,但是我不安分的智力想成为一个更好的程序员,而不仅仅是解决问题。所以,我发布了脚本1.0和脚本1.1来询问社区,为什么第3行的更改会使其工作?
我正在从服务器复制文件并重命名它们。复制很顺利;重命名不是。这些文件名有空格。 cp
胜任地处理它们; mv
似乎抛出了一个错误。我希望在变量名称周围添加""
来解决问题,但它仍然会出错:mv: rename /src/foo.wav to zzz - /dest/foo.wav - copied 201403261800.wav: No such file or directory
。我试图在" zzz"到文件名,但它被添加到目标路径前面。这是脚本1.0:
cd /src/
DATE=$(date +"%Y%m%d%H%M")
find . -type f -iname "*.wav" | while read file ; do
if [[ "$file" != *zzz* ]]; then
echo "Tranferring...";
cp "$file" /dest/
mv "$file" \zzz\ \-\ "$file"\ \-\ copied\ $DATE.wav
echo "Transfer complete.";
fi
done
(if
条件确保我不会重新复制我之前复制和重命名的内容。)
更改第3行使其有效。但为什么?这是脚本1.1:
cd /src/
DATE=$(date +"%Y%m%d%H%M")
find *.* -iname "*.wav" | while read file ; do
if [[ "$file" != *zzz* ]]; then
echo "Tranferring...";
cp "$file" /dest/
mv "$file" \zzz\ \-\ "$file"\ \-\ copied\ $DATE.wav
echo "Transfer complete.";
fi
done
答案 0 :(得分:2)
如果您查看不同find
命令的输出,您会看到find . -type f
将返回如下行:./passwd
。
现在,您无法将其用作目标,因为将./passwd
重命名为zzz - ./passwd
会尝试将其zzz - .
移至passwd
文件夹。
顺便说一句,你可以用引号包围整个目标名称,使它看起来更好(你也不应该逃避第一个z):
mv "$file" "zzz - $file - copied $DATE.wav"
你也可能想要摆脱文件中间的.wav部分:
mv "$file" "zzz - ${file%.wav} - copied $DATE.wav"
${var%string}
返回$ var的值,如果存在,则从其末尾删除字符串。你可以找到更多关于这个寻找bash字符串操作的信息。