最近我的 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
我想做的是:
- 查找
.7z.bad
当前目录(以及所有子目录)中的任何文件 - 对于
.7z.bad
找到的任何文件,如果还存在没有 .7z.bad 扩展名的相同文件: - 删除
.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
如果要测试解压后的文件是否存在,和文件大小非零。