正在寻找一种方法来重命名大量文件

时间:2011-12-12 21:44:26

标签: regex bash

对于当前目录中的每个文件,我想: 将“ - ”替换为“ - ”,将“+”替换为“”。

我猜这将是bash脚本和正则表达式的某种组合,但我从来没有做过。我在OS X上,虽然我认为这不重要。

谢谢!

7 个答案:

答案 0 :(得分:2)

for file in *; do 
    new=${file//-/ - }; 
    new=${new//+/ }; 
    if [ "$file" != "$new" ]; then 
        mv "$file" "$new"; 
    fi; 
done

答案 1 :(得分:1)

unix方式:

for a in * ; do 
    mv $a $(echo $a | sed -s 's/-/ - /' -e 's/\+/ /')
done

unix调试方式涉及在'mv'之前运行'echo mv'直到你确定。

答案 2 :(得分:0)

如果可以,我建议安装/使用detox

答案 3 :(得分:0)

@Kevin我会使用tr来保证安全,你也需要在sed命令之间使用第二个管道运算符:

for f in `ls` ; do 
    mv $f $(echo $f | sed -s 's/-/ - /' | tr '+' ' ')
done

如果要取消有关将同一文件移动到自身的错误消息,请使用以下命令:

for f in `ls` ; do 
    n=$(echo $f | tr -s 's/-/ - /' | tr '+' ' ')
    if [ $f != $n ]; then
        mv $f $n
    fi
done

答案 4 :(得分:0)

我的版本:

for FILE in `find . -maxdepth 1 -type f`; do mv "$FILE" "`echo "$FILE" | sed -e 's/-/ - /g' -e 's/+/ /g'`"; done;

答案 5 :(得分:0)

这可能对您有用:

printf "%s\n" * | 
sed 'h;y/+/ /;s/-/ - /g;x;G;/\(.*\)\n\(\1\)/d;s/\(.*\)\n\(.*\)/mv -v '\''\1'\'' '\''\2'\''/' |
sh

答案 6 :(得分:-1)

嗯,这是Bash的方法,但我不确定它是否适用于OSX。它使用了parameter substitution的漂亮技巧。

for file in *
do
  newFile=${file//+/ }
  newFile=${newFile//-/ - }
  mv "$file" "$newFile"
done

编辑:好的,你们中哪一个都投了我一票?解释一下自己。我的回答几乎与最高回答相同,我先回答。