2013-03-11 222 views
0

我有一個有趣的問題,我希望可以通過shell命令輕鬆解決。我有一個目錄樹,其中的目錄名是有意義的,每個目錄內有幾個文件,包括一個.mp3文件。重命名文件以匹配目錄名稱

我想批量重命名所有的mp3文件以匹配目錄的名稱。

例如高級別的目錄看起來是這樣的:

Seans-iMac% ls 
2006.James Lovelock: Gaia’s Revenge 
2006.Religion and stem cell research 
2006.Stephen Schneider 
2006.Tony Judt: Post-war Europe since 1945 
2006.Water management 
2007.'Here, Bullet' 
2007.Alan Bennett 

每個子目錄的內容是相似的,如:

Seans-iMac% cd "2006.Religion and stem cell research" 
Seans-iMac% ls 
details.txt  lnl_20060605.mp3 synopsis.txt 

我想將它改成這樣:

Seans-iMac% ls 
details.txt  2006.Religion and stem cell research.mp3 synopsis.txt 

我試過循環但似乎無法獲得參數正確。爲了使它更復雜,目錄名稱有空格,並且有些單引號。

+0

請更新您的代碼到目前爲止的問題 – 2013-03-11 13:50:12

回答

3

如果確定有在每個子目錄最多一個MP3文件,這應該這樣做:

for i in *; do mv "$i"/*.mp3 "$i/$i.mp3"; done 

注意雙引號,即處理空間。

+0

完美 - 它也提交了單引號。 – ardochhigh 2013-03-11 15:55:46

2
for d in 2???.* 
do 
    mv "$d"/*.mp3 "$d/$d.mp3" 
done 

glob模式會生成您感興趣的目錄名稱,保留名稱中的空格。 mv命令假定子目錄中只有一個.mp3文件,因此第一個參數將展開爲正確的文件名(空格將再次保留),第二個參數具有所需的格式。請注意,*.mp3位於雙引號字符串之外;這允許文件名稱擴展。請注意,目錄名稱(可能包含空格)始終位於雙引號內,以避免丟失空格。

請謹慎使用除glob以外的機制來生成目錄名稱。這並不是說他們不能使用;只需要小心。請注意,包含換行符的目錄名稱比空格更容易出現問題;我會重命名這些目錄,以便它們不包含換行符(對於包含換行符的文件名同樣適用)。名字中的首尾空白也可能存在問題。

+0

謝謝喬納森給出了非常明確的答案。我給了他,因爲他有相同的答案,他的堆棧溢出評分遠低於你的。我很感謝你的詳細解釋。 Sean – ardochhigh 2013-03-11 15:57:21

2

我的印象是你使用tcsh作爲shell。 因爲我不是一個大的專家,下面的代碼會生成一個bash shell並使用bash語法。

bash -c 'find /path/to/root/dir -name \*.mp3 | while read file; do d=`dirname "$file"`; b=`basename "$d"`; echo mv -v "$file" "$d/$b.mp3";done' 

這不會做任何修改,它只是迴應將被執行的命令。如果在重複檢查後確實按照您的要求進行操作,請在mv命令前刪除echo

這與上面的限制相同,如果目錄中有多個mp3文件,最後(按字母順序排列)的文件將具有directory.mp3的名稱,並且所有其他mp3文件將被覆蓋(讀:失去)。

這種情況的不同之處在於文件夾的結構可以嵌套而不一定在一個層次上。

+0

關於'csh'的有趣觀察 - 基於提示中的'%',毫無疑問。我不會花費更多的時間在關於['csh'編程被認爲是有害的]的常見問題解答(http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/)上。大多數人不使用C Shell進行嚴格的shell編程。 – 2013-03-11 15:35:49

+0

我正在使用zsh。該機器是一個新的版本,我剛剛安裝了默認設置。 – ardochhigh 2013-03-11 15:52:57