簡體   English   中英

使用“find ... -delete”僅從特殊子目錄中刪除圖像文件

[英]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

所以這里是我的問題:

  • 為什么-delete不起作用?
  • 這個命令對於路徑和文件名中的空格、全局字符和外來字符等“盛會”真的安全嗎?
  • 我將如何重寫上述命令,仍然使用bashfind
  • 能否優化命令(重新速度、安全性、嵌套查找)?

在實際集合中,該命令要遍歷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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM