(1)、(2)のファイルが存在しない場合は、そのファイルを削除してください。

(1)、(2)のファイルが存在しない場合は、そのファイルを削除してください。

私の写真ライブラリはめちゃくちゃです。一部のコピーのため、私の画像は次のようになります。

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).pngand が存在するが存在somefile (2).pngしない場合、およびsomefile.pngsomefile (1).pngすべてsomefile (2).png保持されます。これが問題になる可能性がある場合は、上記のコマンドを実行した後、(1)次のコマンドperl-renamerenameUbuntuや他の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

重複したファイル名は削除されませんが、同じ内容の連続ファイルは削除されます。

関連情報