解决方案

解决方案

我正在尝试从受“愚蠢”Crypt0L0cker 勒索软件影响的 Windows 存档中恢复一些文件。事实上,在快速检查将文件移动到我自己的系统后,恶意软件似乎只是向文件添加了第二个随机扩展名(是的,我知道“扩展名”并不意味着什么)。手动重命名文件就可以了。

“List for 2016.doc.irolox” -> 手动重命名 -> “List for 2016.doc”

我想要一些运行此工作流程的提示:

  • 在给定文件夹的所有子目录中递归循环
  • 文件名称中包含空格(但真实名称中不包含点)
  • 某些文件似乎不受影响。规则:如果它们只有一个“扩展名”,则不要考虑它们(因此,如果检测到 2 个点 -> 文件会受到影响)
  • 重命名文件,删除最后一个“扩展名”。

有什么秘诀可以达到这个结果吗?

答案1

首先转到文件夹 archive,然后运行以下命令:

find | awk -F'.' '{if ($3 != "" && $4 != "" ){system("mv "$0" ./"$2"."$3)}}'

这将查找文件夹和子文件夹中的每个文件,如果发现该文件有两个扩展名,它将仅使用第一个扩展名重命名它

例如命令之前的文件夹:

.
./lolo.doc
./soso
./soso/jojo.doc.koko.momo
./kokooiko.doc.soso
./jojo.doc.koko

命令后的文件夹:

.
./lolo.doc
./kokooiko.doc
./jojo.doc
./soso
./soso/jojo.doc

答案2

您可以使用变量替换,例如:

MYVAR="List for 2016.doc.irolox"
echo ${MYVAR%.*}

上面.*从变量值的后端删除了最短匹配。

这样您就可以使用以下命令重命名该文件:

mv "${MYVAR}" "${MYVAR%.*}"

答案3

解决方案

创建一个脚本,该脚本将采用任意数量的参数,并重命名文件并删除任意扩展名。例如,

cat > /tmp/rename_script.sh <<'EOF'
#!/bin/bash
while [ $# -gt 0 ]; do
  mv "$1" "${1%.*}"
  #alternatively to strip multiple extensions
  #mv "$1" "${1%.doc.*}.doc"
  shift
done
EOF
#enable execute perms
chmod 755 /tmp/rename_script.sh

以下find命令将传递一个或多个受影响的文件作为参数rename_script.sh(将从受影响文件的工作目录-execdir执行)。rename_script.sh下面是一个例子。

find /path/to/affected/dir -type f -name '*.doc.*' -execdir /tmp/rename_script.sh {} +

笔记:我建议您对小样本文件进行操作以进行初步测试。在对所有文件执行此解决方案之前,请备份旧的“勒索软件文件”。

find (GNU findutils) 4.4.2在 Debian 8/Jessie 上进行了测试。

补充阅读

  • man bash并查找Special ParametersParameter Expansion、 和Compound Commands
  • man find并查找-execdir选项。

相关内容