Shell-Script

按副檔名查找重複文件並刪除它們的腳本

  • August 24, 2021

最近我的 NAS 被勒索軟體攻擊,我所有的文件都被7zip 了。我設法獲得了密碼並解壓它們,同時我將7zipped文件重命名為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文件

我想檢查原始文件是否存在的原因只是為了另一個級別的安全性。

恐怕我無法fdupes在我的 Qnap NAS 中安裝任何其他工具(如 )。

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

引用自:https://unix.stackexchange.com/questions/665843