私の写真ライブラリはめちゃくちゃです。次のファイルがあります。
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