删除Linux目录中的所有可执行文件

删除Linux目录中的所有可执行文件

在递归 tar 目录之前,我希望能够删除所有可执行文件。在 Windows 中,我只需删除所有带有 .exe 扩展名的文件即可。而且,我不能简单地删除所有具有可执行模式的文件,因为那样也会删除 shell 脚本。那么,有没有办法自动删除目录中的非 shell 脚本文件?

答案1

我猜你指的是二进制文件?如果可执行文件的数量非常大,此命令可能会失败,因为“file”和“echo”的命令行太长。一个简单的例子:

find /bin -type f | xargs file | grep "ELF.*executable" | awk -F: '{print $1}' | xargs echo

如果将上述示例中的“echo”替换为“rm”,则这些文件将被删除。“grep”命令应可防止库被删除(您可以在 /lib 上进行测试)。

(请注意,我现在只能访问 FreeBSD,因此 linux 的“文件”命令的输出可能会有所不同,从而改变您需要执行的操作。)

这应该会为您提供一个简单的模板。您只需要确保知道在“file”给出的输出中要查找什么,然后相应地使用 grep。

要小心。如果你以 root 身份在错误的目录上运行此命令,你的系统可能会完全崩溃。

答案2

find . -perm /111 -type f -exec echo rm -v {} \;

这里的神奇之处在于 -perm 标志(表示权限)可以在权限参数前面使用 /,这会导致它在每个位上搜索逻辑或。从手册页中可以看到:

   -perm /mode
          Any  of the permission bits mode are set for the file.  Symbolic
          modes are accepted in this form.  You must specify 'u',  'g'  or
          'o'  if  you  use a symbolic mode.  See the EXAMPLES section for
          some illustrative examples.  If no permission bits in  mode  are
          set,  this  test  currently  matches no files.  However, it will
          soon be changed to match any file (the idea is to be  more  con-
          sistent with the behaviour of perm -000).

如果不清楚,/ 指定 111 指定用户中的 x 或组中的 x 或其他人中的 x。这些不是异或,所以我们至少要寻找一个,但最多要寻找 3 个。

由于 unix 文件权限

rwxrwxrwx
421421421

我们关心的是 x 位,我们得到一个掩码

--1--1--1

或 111

需要注意的是,上面列出的命令中有一个回声,以防止你搬起石头砸自己的脚。一旦你正确地确定了文件,就可以随时取消安全措施。

编辑

好吧,这也打败了所有 shell 脚本。由于正则表达式匹配相对原始,我发现 find 无法提供很好的、简洁的方法。我可以使用正则表达式找到您想要的所有 .sh 文件:

   -regex ".*\(.*sh\$\)"

但我根本无法逆转它。所以我放弃了。我仍然把它留在这里,希望它对某人有用。

编写一个 shell 脚本,或者使用其他人的建议,或者如果您确实想要,只需暂时删除 shell 脚本的可执行权限,删除所有可执行文件,然后重新添加 +x。祝你好运。

答案3

file * | grep executable | grep -v 'shell script' | cut -d: -f 1 | xargs rm

也许:

make clean

;-)

答案4

您需要find遍历树中的文件,使用file命令行实用程序确定它们的文件类型,然后perl过滤可执行文件:

find . -type f -print0 | xargs -0 file -N0 -- \
| perl -nlwe '/(.*\0).*ELF.*executable/ and printf $1' | xargs -0 ls -l --

您确实要删除文件,请将最后的替换ls -l --rm --

注意:所有-print0-0开关都是必需的,以确保正确处理文件名中的空格。这也是为什么perl使用 而不是 的原因awk,后者实际上无法吞掉输入中的空字符。这些--开关旨在防止文件名以破折号开头。

相关内容