2011-11-13 42 views
1

我想刪除由iTunes創建的重複文件,這些文件都以「1.mp3」結尾。我已經接近匹配,但我不知道如何匹配空間。有人可以寫一個命令遞歸地從當前目錄中刪除這些文件嗎?在bash中匹配空格

回答

3

你想通過你的iTunes音樂收藏,並刪除Nickelback的如果我不在乎1.MP3但是,只有當Nickelback樂隊原MP3,如果我care.mp3,依然存在。對?

嘿,你的音樂品味是由你...

這應該做的伎倆:

find -name "* 1.mp3" | while read file 
do 
    if [ -e "${file% 1.mp3}.mp3" ] 
    then 
     rm $file 
    fi 
done 

我發現所有(在空間1.MP3結束歌曲)的重複並將它們管理到while聲明。

${word%filter}語法表示採取$word並從右側刪除glob表達式filter。因此,${file% 1.mp3}是該文件的名稱,其後綴爲1.mp3。現在,If I care 1.mp3變成If I care。因此,我們需要重新添加.mp3後綴。因此${file% 1.mp3}.mp3。這給了我們文件的原始名稱。

現在我們使用-e測試來檢查該文件是否存在。如果是這樣,我們可以刪除歌曲的space-1.mp3版本。

我跑了一些基本的測試,但我建議你先嚐試一下(也許首先更改rm $fileecho Removing file $file並驗證這些文件是否有原始文件)。

+0

我很抱歉這麼晚回覆,它完美的工作,並感謝偉大的解釋。 – Chironex

0
find . -name "* 1.mp3" -exec rm {} \; 
2

聽起來像find的工作!

find . -type f -name '* 1.mp3' -print0 | xargs -0 rm 
1

其他解決方案類似,但會檢查文件沒有的「1」後綴真的存在,因此它不會不期而遇刪除歌曲後綴名爲「1」。

shopt -s globstar 
for file in **/*' '1.mp3 ; do 
    if [[ -f "${file% 1.mp3}.mp3" ]] ; then 
     rm "$file" 
    fi 
done 
+0

當'file.mp3'實際上是'file 1.mp3'的符號鏈接時,這裏就有一個漏洞。此外,你可以做一個校驗和,看看這些文件是否真的是一樣的...哎呀,你可以做一個模糊檢查的情況下,編碼/標籤是不同的。現在得到相當偏離 – sehe

0

更快:

find . -name "* 1.mp3" -exec rm {} + 
0
find . -type f -name '* 1.mp3' -print0 | xargs -0 rm 

哪個kbyrd提到是根據我的最佳方式,因爲-print0和-0組合,因爲。

-print0 True;在標準輸出上打印完整文件名,然後用空字符(而不是 -print使用的換行符)跟在 之後。這允許包含換行符或其他類型的空格的文件名由處理查找輸出的pro- 克正確解釋。該選項對應於xargs的-0選項 。