私の写真ライブラリはめちゃくちゃです。一部のコピーのため、私の画像は次のようになります。
IMG_20220505_1701.jpg
IMG_20220505_1701 (1).jpg
IMG_20220505_1701 (2).jpg
これで、名前に(1)または(2)を含むすべての写真を削除したいと思います。ただし、そのファイルのファイルがない場合にのみ適用されます。どうすればいいですか?
答え1
数字のないファイルがある場合、名前に括弧内の数字を含むすべてのファイルが削除されます。
for file in *'('* ; do
origFile=$(sed 's/ *([0-9]*)//' <<<"$file")
[ -e "$origFile" ] && [ "$file" != "$origFile" ] && rm -- "$file"
done
数字のないファイルがない場合は、すべての数字ファイルが保存されます。たとえば、somefile (1).png
and が存在するが存在somefile (2).png
しない場合、およびsomefile.png
はsomefile (1).png
すべてsomefile (2).png
保持されます。これが問題になる可能性がある場合は、上記のコマンドを実行した後、(1)
次のコマンドperl-rename
(rename
Ubuntuや他のDebianベースのディストリビューションから呼び出されます)を使用してすべてのファイルの名前を変更できます。
rename -- 's/ \(1\)//' *'(1)'*
その後、最初のコマンドを再実行して1つだけを維持します。または、ファイルのみが存在する状況が発生した場合は、試してみることもでき(2)
ます(N)
。
答え2
を使用すると、zsh
次のことができます。
rename-or-delete() {
if [[ -e $2 ]]; then
rm -- $1
else
mv -- $1 $2
fi
}
autoload zmv
zmv -n -f -P rename-or-delete '(*) \(<->\)(.jpg)' '$1$2'
(-n
必要に応じてテストを実行するために削除)。
答え3
あなたが要求したものとまったく一致しないが、(テストされていない)同じ精神だと思います。
#!/bin/sh
last=x
for i in * ; do
if [ -f "$i" ] ; then
if cmp "$last" "$i" ; then
rm -f "$i"
else
last="$i"
fi
fi
done
重複したファイル名は削除されませんが、同じ内容の連続ファイルは削除されます。