Shell
刪除所有沒有重複名稱的文件?
給定大量文件,其中包含以下內容:
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
循環的結束。