Bash
刪除同名但副檔名不同的文件
我的照片庫裡亂七八糟。我有這樣的文件:
image-1.jpg image-1.jpeg image-2.jpg
現在,當有一個同名但副檔名為 .jpg 的文件時,我想刪除所有副檔名為 .jpeg 的照片。
我怎樣才能做到這一點?
for f in *.jpeg; do [ -e "${f%.*}.jpg" ] && echo rm -- "$f" done
echo
(如果高興就刪除)。一次呼叫
zsh
:rm
echo rm -- *.jpeg(e'{[ -e $REPLY:r.jpg ]}')
(更改
*
為**/*
遞歸執行此操作,添加D
glob 限定符,如果您還想考慮隱藏文件或隱藏目錄中的文件)。
對類似問題的答案的改編:
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 答案的遞歸變體)