首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >脚本,通过扩展名查找重复文件并删除它们

脚本,通过扩展名查找重复文件并删除它们
EN

Unix & Linux用户
提问于 2021-08-23 07:18:53
回答 2查看 226关注 0票数 0

最近,我的NAS遭到了洗劫软件的攻击,我所有的文件都被输入了7z。我设法获得了密码并将其解压缩,同时将7压缩文件重命名为7z.bad (这样以后只删除受影响的文件就更容易了,而不是攻击前我已经拥有的任何实际.7z文件)。

这是我用来提取和重命名文件的脚本:

代码语言:javascript
复制
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

所以,我现在有很多重复的,像这样:

代码语言:javascript
复制
Phone book.xlsx
Phone book.xlsx.7z.bad

我想做的是:

  1. 查找当前目录(和所有子目录)中的任何.7z.bad文件
  2. 对于找到的任何.7z.bad文件,if也存在没有.7z.bad扩展名的同一个文件:
  3. 删除.7z.bad文件

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

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

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2021-08-23 09:55:12

代码语言:javascript
复制
find . -type f -exec sh -c 'for name do rm -f -- "$name.7z.bad"; done' sh {} +

上面的文件查找当前目录中或目录下的所有常规文件,然后尝试删除所有这些文件,但首先将.7z.bad添加到名称的末尾。

这样,如果有相应的文件没有该文件名后缀,所有以.7z.bad结尾的文件都会被删除。

在否则为空的目录中进行测试:

代码语言:javascript
复制
$ 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
代码语言:javascript
复制
$ find . -type f -exec sh -c 'for name do rm -f -- "$name.7z.bad"; done' sh {} +
代码语言:javascript
复制
$ ls
file-1.txt        file-2.txt        file-3.txt        file-4.txt.7z.bad file-5.txt.7z.bad
票数 2
EN

Unix & Linux用户

发布于 2021-08-23 09:40:42

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/665843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档