Shell

刪除所有沒有重複名稱的文件?

  • December 26, 2018

給定大量文件,其中包含以下內容:

FILE1.doc
FILE1.pdf
FILE2.doc
FILE3.doc
FILE3.pdf
FILE4.doc

是否有一個終端命令可以讓我刪除列表中沒有重複名稱的所有文件?在這種情況下…FILE2.doc 和 FILE4.doc?

使用 bash,這將刪除所有沒有另一個同名但副檔名不同的文件的文件:

for f in *; do same=("${f%.*}".*); [ "${#same[@]}" -eq 1 ] && rm "$f"; done

這種方法對所有文件名都是安全的,即使是那些名稱中有空格的文件。

這個怎麼運作

  • for f in *; do

這將開始循環遍歷目前目錄中的所有文件。

  • same=("${f%.*}".*)

這將創建一個 bash 數組,其中包含具有相同基本名稱的所有文件的名稱。

$f是我們文件的名稱。 ${f%.*}是不帶副檔名的文件名。例如,如果文件是FILE1.doc,那麼${f%.*}FILE1"${f%.*}".*是具有相同基本名稱但具有任何副檔名的所有文件。 ("${f%.*}".*)是這些名稱的 bash 數組。 same=("${f%.*}".*)將數組分配給變數same

  • [ "${#same[@]}" -eq 1 ] && rm "$f"

如果只有一個具有此基本名稱的文件,我們將其刪除。

"${#same[@]}" 是數組中的文件數same[ "${#same[@]}" -eq 1 ]如果只有一個這樣的文件,則為真。

&&是邏輯與。它使後面的語句rm "$f"只有在它前面的語句返回邏輯真時才被執行。

  • done

這標誌著for循環的結束。

引用自:https://unix.stackexchange.com/questions/216357