[英]Using "find … -delete" to remove image files only from special subdirectories
我需要從不需要的圖像中清除我的音樂收藏中的一些子目錄。 我正在使用 Ubuntu 14.04 和/或 Linux Mint 17.2 以及使用find命令的 bash shell 腳本。
目錄結構(最小示例)如下:
Tagged
Artist #1
Artist #1 - An Album
Artist #1 - A Track.flac
cover.jpg
something.png
Artist #1 - [compilations]
Artist #1 - A Track.flac
cover.jpg
something.png
Artist #2
Artist #2 - Another Album
Artist #2 - A Track.mp3
cover.jpg
僅在以“[編譯]”結尾的子文件夾中,我想刪除所有類型的 jpeg 和/或 png 圖像(因為標記軟件錯誤地將它們放在那里)。 任何碰巧在普通“相冊”文件夾中的圖像我也希望保留。
在我的目錄結構中,名稱中帶有“[compilations]”的文件夾只能出現在“Artist”文件夾的正下方; 所以最多兩層深。
我想出了以下 find 命令:
$ cd Tagged
$ find . -maxdepth 2 -type d -name '*\[compilations\]' -exec find {} -type f -iname '*.jp*g' -or -iname '*.png' -delete \;
這似乎做了一些事情並且需要一段時間,但是文件“./Artist #1/Artist #1 - [compilations]/cover.jpg”和“./Artist #1/Artist #1 - [compilations] /something.jpg”和“./Artist #1/Artist #1 - [compilations] /something.jpg” png”仍然存在(以及所有其他圖像文件)。
作為 Linux 新手,我認為我使用find的-delete選項犯了一個愚蠢的錯誤,因為以下命令(沒有-delete )正確顯示了文件:
$ find . -maxdepth 2 -type d -name '*\[compilations\]' -exec find {} -type f -iname '*.jp*g' -or -iname '*.png' \;
./Artist #1/Artist #1 - [compilations]/cover.jpg
./Artist #1/Artist #1 - [compilations]/something.png
所以這里是我的問題:
在實際集合中,該命令要遍歷16899個文件夾,幾乎都包含空格和外來字符(如捷克語、俄語、日語、希臘語、德語……),所以它必須是健壯的。
在此先感謝您的任何見解和啟發!
經過一些實驗,我認為我的錯誤在於沒有將 OR 部分放在括號中- 似乎find僅在最后一個 OR的右側部分使用了-delete ,即試圖刪除“*.png”。 唉,幾乎我所有的封面圖片都是“*.jpg”,所以我認為它根本行不通!
所以我認為更正的命令應該是:
$ find . -depth -maxdepth 2 -type d -name '*\[compilations\]' -exec find {} -type f \( -iname '*.jp*g' -or -iname '*.png' \) -delete \;
它似乎在我上面的測試用例上正常工作。
盡管如此,一些確認會很好。 也許是我其他問題的一些答案,僅供參考和學習。 謝謝!
您的-delete
謂詞僅適用於
-iname '*.png'
謂詞,因為你錯過了分組:當你給find
了以下情況:
-type f -iname '*.jp*g' -or -iname '*.png' -delete
由於布爾運算符的優先級, find
理解:
\( -type f -iname '*.jp*g' \) -or \( -iname '*.png' -delete \)
要解決此問題,請使用:
-type f \( -iname '*.jp*g' -or -iname '*.png' \) -delete
我建議您嘗試將-delete
替換為-print
:您會看到-delete
適用於什么!
現在,關於您的嵌套find
:由於您的目錄樹的結構(您的文件只有深度 3),您應該只能使用find
一個實例:
find -maxdepth 3 -path '*/*\[compilations\]/*' \( -iname '*.jp*g' -o -iname '*.png' \) -type f -print
(我把-print
而不是-delete
以便您可以在使用-delete
執行之前檢查命令)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.