2014-03-26 51 views
1

在发布这个问题的过程中,我一直在试验我的代码,我提出了一些可行的方法,但我不安的智慧想成为一个更好的程序员,而不是只是解决手头的问题,所以我发布脚本1.0和脚本1.1来问社区,为什么第3行的更改使其工作?prepend文件名,而不是目的地路径,使用mv

我从服务器复制文件并重命名它们。复制进行得很好;重命名不是。这些文件名有空格。 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 

回答

2

如果你看看在不同find命令的输出,你会看到find . -type f将返回这样的行:./passwd。 现在你不能使用它作为目标,因为重命名为./passwdzzz - ./passwd会尝试将其移动到zzz - .文件夹中作为passwd

顺便说一句,你可以围绕整个目标名称加上引号,使它看起来更好(你也不能逃脱第一Z反正):

mv "$file" "zzz - $file - copied $DATE.wav" 

而且你可能想摆脱在文件的中间部分的.wav:

mv "$file" "zzz - ${file%.wav} - copied $DATE.wav" 

${var%string}返回用绳子$ VAR值,如果从目前的它端排出。你可以找到更多关于这个寻找bash字符串操作的信息。

+0

这超出了我的问题的范围,这真的帮助了我。我只是测试了这一切,它都运行得很好。谢谢。 – Crowder

相关问题