2011-12-12 44 views
1

对于当前目录中的每个文件,我想要: 用“ - ”替换“ - ”并用“”替换“+”。寻找一次重命名大量文件的方法

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

谢谢!

+0

你有没有尝试过自己? – piotrekkr

+0

试试这个问题:http://stackoverflow.com/questions/8416990/shell-bash-shortcut-for-bulk-renaming-of-files-in-a-folderlinux/8418112#8418112 – telenachos

回答

1

了Unix的:

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

Unix的调试方法涉及前 'MV' 跑步 '回声MV' 直到你确定。

+1

这会有问题,因为名称中的空格用引号引起来。 – Kevin

+0

不仅仅是“潜在的问题”,还有保证的问题,因为它会为目标文件名添加空格...... – BRFennPocock

-1

那么,这里是Bash的方式来做到这一点,但我不知道它是否可以在OSX中工作。它使用了parameter substitution的妙用。

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

编辑:好吧,你们哪一个downvoted我吗?自己解释一下。我的答案几乎与顶级答案相同,我首先回答。

+0

这不是我,而是1.你应该检查文件是否需要移动,以及2.你忘了印记('$')放在'mv'的'file'前面。 – Kevin

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

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

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 
0

我的版本:

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

你能解释一下/为什么这会起作用吗? – Nightfirecat

+0

这是一个循环,它遍历当前目录('find ...')中的文件列表,并为每个找到的文件替换'-''到'' - ''和''+''到''' '使用'sed'和正则表达式。 – piotrekkr

0

这可能哟工作你:

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