名前は同じですが、ファイル拡張子が異なるファイルを削除する

名前は同じですが、ファイル拡張子が異なるファイルを削除する

私の写真ライブラリはめちゃくちゃです。次のファイルがあります。

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

名前は同じですが、拡張子が.jpgのファイルがある場合は、拡張子が.jpegの写真をすべて削除したいと思います。

どうすればいいですか?

答え1

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修飾子を追加してください。)

答え2

から適応同様の質問に対する回答:

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 {} +

(これにより、次の再帰的な変形が発生することがわかります。Stefan Chazerasの答え)

答え3

readonly path="${1:-./}"

for file in "${path}"*.jpeg; do
  if [[ -f ${file%.jpeg}.jpg ]]; then
    rm -- "$file"
    printf '%s\n' "removed duplicate file ${file}"
  fi
done

上部の読み取り専用変数を使用すると、ディレクトリパスをスクリプトにパラメータとして渡すことができます。引数が指定されていない場合、デフォルトは現在のディレクトリです。

単にvarパスで指定されたディレクトリで「.jpeg」で終わるすべてのファイルを繰り返します。次に、拡張子を削除し、.jpg拡張子を持つ同じファイルが存在するかどうかをテストします。 .jpg 重複ファイルが存在する場合、.jpeg ファイルは重複ファイルとみなされ、削除されます。

答え4

現在の回答は質問本文の特定のケースに対する回答ですが、削除の場合みんな他のファイルはマージされました。Stefan Chazerasの答えそしてこの回答グローバルマッチ除外関連:

shopt -s extglob

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

関連情報