递归删除文件夹中的所有二进制文件

4

我想使用命令行或bash脚本在Linux下 递归删除指定文件夹中的所有二进制文件。我已经找到了以下的命令:

grep -r -m 1 "^"  path/to/folder | grep "^Binary file"

列出“path/to/folder”中所有二进制文件的方法请参考如何列出目录树中所有二进制文件扩展名?。现在,我想删除所有这些文件。 我可以执行:
grep -r -m 1 "^"  path/to/folder | grep "^Binary file" | xargs rm

但这有点可疑,因为它还试图删除名称为“Binary”、“file”和“matches”的文件,如下所示:

rm: cannot remove ‘Binary’: No such file or directory
rm: cannot remove ‘file’: No such file or directory
rm: cannot remove ‘matches’: No such file or directory

问题在于,我该如何正确删除这些文件呢?

这是一个不好的“二进制文件”的定义。不管怎样 - 我建议你阅读有关单词分割的内容。我相信你很快就能理解你问题的根源。 - Rany Albeg Wein
确实有效,谢谢!我同意“二进制文件”的定义并不是很好(请参见下面vesche的答案及其讨论),但它恰好捕捉到了我在给定用例中想要删除的文件。 - Christian
3个回答

7
这个命令会递归地返回一个目录中所有的二进制可执行文件,请先运行该命令以确保正确的输出。
find . -type f -executable -exec sh -c "file -i '{}' | grep -q 'x-executable; charset=binary'" \; -print

如果这样做有效,您可以将输出传递给xargs来删除这些文件。
find . -type f -executable -exec sh -c "file -i '{}' | grep -q 'x-executable; charset=binary'" \; -print | xargs rm -f

希望这有所帮助,祝你度过愉快的一天! :)

啊,我的错误,我以为你是指二进制可执行文件,请尝试这个命令:find . -type f -exec sh -c "file -i '{}' | grep -q 'charset=binary'" \; -print - vesche
嗯,那可能是我查看的tar程序的错误,但该命令还列出了多个原始c文件,例如./pkg/meataxe/src/zgauss.c,我肯定不想删除它们... - Christian
很奇怪,我实际上找到了你正在查看的Meataxe版本(http://www.math.rwth-aachen.de/~MTX/download.html),我相信是2.1版本?那些.c文件出现为二进制文件,这是不寻常的。看起来这在后来的版本中得到了修复...文件中有非ASCII字符,在它说“* MeatAxe-2.0,Phase II.^?”的那一行上。您可以使用此grep -P '[\x7f-\xff]'./pkg/meataxe/src/*查看它,这将找到非ASCII字符。 - vesche
哇,不错——确实是来自1997年阿亨的2.2.3版本。 - Christian
好的,我把这看作是一个教训,“如何区分二进制文件和包含少量非ASCII字符的文本文件并不清楚”...非常感谢你的努力! - Christian
显示剩余10条评论

1

如果您要删除文件夹中的大量二进制文件,这应该可以完成工作。

 find . -type f -executable | xargs rm

1
我编写了一个工具,名为blobs,它列出可运行的二进制文件。
它的自述文件提到了如何将其管道传输到任何其他命令。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接