2012-04-15 67 views
2

有一些文件名包含'?'如你所知,windows有這類字符的問題。我想用xarg遞歸地重命名文件夾中的所有文件。例如遞歸重命名文件並刪除一個字符

09 - grand hall?_10.mp3 

應該

09 - grand hall_10.mp3 
+0

當你在它的時候,你想刪除空格嗎? – Shep 2012-04-15 14:29:28

+0

這並不壞。那麼該怎麼辦? – mahmood 2012-04-15 14:30:40

+0

並解決_have to_ use'xarg'? – Shep 2012-04-15 14:31:03

回答

1

for file in $(find folder -name '*.mp3'); do
  mv -v "$file" $(echo "$file" | tr ? _);
done


上面有空白的問題;這是更好的:

find folder -name '*.mp3' -exec echo "'{}'" \; |
  while read file; do
    echo -n "mv -v $file " && echo $file | tr ? _;
done | sh

的想法是找到的所有文件,然後在報價呼應他們。將輸出傳送到一個while循環中,該循環爲每個文件構造一個mv命令,然後將轉換爲新的shell。

醜,但如果你不喜歡答案,你不應該問這個問題。 :-)

+0

空間造成噪音。如何去除它們? – mahmood 2012-04-15 14:32:12

+0

@AdamLiss我已經在'$ file'中解決了一些小問題,但它仍然使用'for $(find _folder_-name'* .mp3')中的'for file'重新標記問題''。你可能想嘗試一些基於'find -print0'的管道,並通過管道傳輸到'read -d'' – je4d 2012-04-15 14:49:29

+0

@ je4d。Tokenizing是固定的,格式是正確的。謝謝您的幫助! – 2012-04-15 15:04:17

1

這是非常醜陋的,但我還是把它作爲一個個人的挑戰找到一個班輪,將工作。 :-)

find folder -name '*.mp3' -exec \
  sh -c "echo -n 'mv \"{}\" ' && echo \'{}\' | tr ? _" \; | sh

的策略是找到文件,使用echo構建mv命令在報價時,其名稱中的每個文件,然後通過管道輸出到一個殼。

+1

找到:缺少參數到'-exec' – mahmood 2012-04-15 13:52:54

+0

@mahmood:固定。謝謝你的收穫! – 2012-04-15 15:05:05

+0

這是這個問題最優雅的答案。謝謝! – 2012-06-29 16:48:31

0

這一個班輪應該工作,即使文件名包含單/雙引號和空格:

(IFS=\0;find . -name \*\\?\* -type f -print0| while read -d '' f;do mv -v $f $(echo $f|tr -d \?);done) 

說明: '?'

  1. find只搜索文件名稱中包含
  2. 設置\0作爲分隔符在IFSfind(由-print0)和read(由-d '')可以處理包含特殊字符,如單引號,雙引號,空格等的文件名
  3. 最外parenthese把整個命令執行在subshel​​l,因此保持當前shell的IFS完好無損。
  4. 腳本中的.可以被任何其他目錄替換。
  5. 但是,這個腳本有一個很小的問題:如果一個文件的名字和其父母的名字之一包含'?',它可能會中斷。這可以被處理,但腳本會變得有點醜陋,而且不太可讀。