使用mv预先添加文件名,而不是目标路径

时间:2014-03-26 23:20:37

标签: bash rename mv

在发布这个问题的过程中,我一直在试验我的代码,我已经想出了一些有用的东西,但是我不安分的智力想成为一个更好的程序员,而不仅仅是解决问题。所以,我发布了脚本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 

1 个答案:

答案 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字符串操作的信息。