拡張子別に重複したファイルを見つけて削除するスクリプト

拡張子別に重複したファイルを見つけて削除するスクリプト

最近、私のNASはランサムウェアの攻撃を受け、すべてのファイルが7z盗まれました。パスワードを調べて抽出すると同時に名前を変更しました。7圧縮ファイルを削除します(攻撃前にすでに持っていた実際のファイルで7z.badはなく、後で影響を受けたファイルをより簡単に削除できるようにするため)。.7z

ファイルを抽出して名前を変更するために使用するスクリプトは次のとおりです。

while [ -n "$(find . -type f -name '*.7z' -print -quit)" ]
do 
    find . -type f -name "*.7z" -execdir /usr/local/sbin/7z x -pPASSWORD {} \; -execdir mv {} {}".bad" \;
done

だから私が今持っているのは、次のように多くの重複です。

Phone book.xlsx
Phone book.xlsx.7z.bad

私がしたいことは:

  1. .7z.bad現在のディレクトリ(およびすべてのサブディレクトリ)でファイルを見つけます。
  2. 見つかったファイルの場合.7z.badもし.7z.bad 拡張子のない同じファイルも存在します。
  3. .7z.badファイルの削除

元のファイルが存在することを確認したいのは、セキュリティレベルをさらに追加するためです。

fdupesQnap NASに他のツール(たとえば)をインストールできないか心配です。

答え1

find . -type f -exec sh -c 'for name do rm -f -- "$name.7z.bad"; done' sh {} +

上記の結果みんな現在のディレクトリ内または下の一般ファイルを削除し、すべて削除し、名前の末尾.7z.badに最初に追加します。

これにより、.7z.bad対応するファイル名サフィックスを持たないファイルが存在する場合、名前で終わるすべてのファイルが削除されます。

空のディレクトリでテストします。

$ touch file-{1..5}.txt.7z.bad
$ touch file-{1..3}.txt
$ ls
file-1.txt        file-2.txt        file-3.txt        file-4.txt.7z.bad
file-1.txt.7z.bad file-2.txt.7z.bad file-3.txt.7z.bad file-5.txt.7z.bad
$ find . -type f -exec sh -c 'for name do rm -f -- "$name.7z.bad"; done' sh {} +
$ ls
file-1.txt        file-2.txt        file-3.txt        file-4.txt.7z.bad file-5.txt.7z.bad

答え2

find . -type f -name "*.7z.bad" -exec sh -c '
  for file; do
    if [ -f "${file%.7z.bad}" ]; then
      rm -- "$file"
    else
      echo "keeping file $file" >&2
    fi
  done
' sh {} +

これは、見つかったすべてのファイル名をfindシェルスクリプトに渡し、ファイル名を繰り返して、サフィックスのない.7z.bad各ファイル名が存在することを確認します。この場合、サフィックスが付いたファイルを削除し.7z.bad、それ以外の場合は警告メッセージを印刷します。

-f使用。 。 。代わりに-s解凍されたファイルがあるかどうかをテストするには、そしてファイルサイズが0ではありません。

関連情報