通过扩展名查找重复文件并将其删除的脚本

通过扩展名查找重复文件并将其删除的脚本

最近我的 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文件

我想检查原始文件是否存在的原因只是为了提高另一个级别的安全性。

我担心我无法fdupes在 Qnap 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给 shell 脚本,然后循环遍历文件名并检查每个不带.7z.bad后缀的文件名是否存在。如果是这种情况,它将删除带有后缀的文件.7z.bad,否则打印一条警告消息。

-f用。。。来代替-s如果要测试解压后的文件是否存在,文件大小非零。

相关内容