Bash

刪除同名但副檔名不同的文件

  • February 3, 2021

我的照片庫裡亂七八糟。我有這樣的文件:

image-1.jpg 
image-1.jpeg
image-2.jpg

現在,當有一個同名但副檔名為 .jpg 的文件時,我想刪除所有副檔名為 .jpeg 的照片。

我怎樣才能做到這一點?

for f in *.jpeg; do
 [ -e "${f%.*}.jpg" ] && echo rm -- "$f"
done

echo(如果高興就刪除)。

一次呼叫zshrm

echo rm -- *.jpeg(e'{[ -e $REPLY:r.jpg ]}')

(更改***/*遞歸執行此操作,添加Dglob 限定符,如果您還想考慮隱藏文件或隱藏目錄中的文件)。

對類似問題的答案的改編:

find . -type f -name '*.jpeg' -exec sh -c '
   for pathname do
       jpg_pathname=${pathname%.jpeg}.jpg
       if [ -f "$jpg_pathname" ]; then
           printf "Would remove %s\n" "$pathname"
           # rm "$pathname"
       fi
   done' sh {} +

這將在目前目錄中或目前目錄下查找所有帶有.jpeg文件名後綴的文件的路徑名。對於盡可能多的這些路徑名,呼叫一個簡短的內嵌腳本。該腳本循環遍歷目前批次的路徑名,並檢測具有相同文件名詞幹的任何文件,後跟.jpg. 如果一個.jpeg文件有對應.jpg的文件,則該.jpeg文件被刪除(如果註釋掉rm被啟動)。

較短的版本(刪除了安全註釋並且沒有文本輸出):

find . -type f -name '*.jpeg' -exec sh -c '
   for pathname do
       [ -f "${pathname%.jpeg}.jpg" ] && rm "$pathname"
   done' sh {} +

(您會注意到這是Stéphane Chazelas 答案的遞歸變體)

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