2011-12-12 45 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