客观的:
在文件夹及其所有子文件夹中搜索前 4 个字节以十六进制序列 00 00 FF FF 开头的文件(例如:*.dat),并删除所有匹配的文件,而不在每次删除文件时提示确认
例如:
在 Linux 中,我考虑使用组合 grep + find + hexdump + rm
例如:
rm -r 递归删除匹配的文件
hexdump -n4 *.dat 提取文件的前 4 个字节
grep '\x00\x00\xFF\xFF' *.dat 查找匹配的文件返回 hexdump 00 00 FF FF
--重要--检查仅在前 4 个字节中是否有十六进制 00 00 FF FF!
文件中其他位置是否有 00 00 FF FF 并不重要!(只需检查前 4 个字节)
另外,请记住它必须扫描当前文件夹及其所有子文件夹中的所有 *.dat 文件
并且 00 00 FF FF 必须符合这个精确顺序
如果可以在 Windows 上使用,那么这是最好的解决方案(即使需要使用第三方实用程序)。但如果有一个可以在 Linux 上运行的解决方案,我会很高兴
我尝试了以下命令,但它什么也没有返回,而且我确信有以 0000FFFF 开头的 *.dat 文件
rm -r | grep '\x00\x00\xFF\xFF' | hexdump -n4 *.dat
我不知道如何通过管道传输所有必需的命令。
关于如何做到这一点有什么想法吗?
提前致谢!
答案1
像这样:
find . -type f -exec bash -c 'hexdump -n4 $1 | grep -q "^0000000 0000 ffff"' Anything {} \; -delete;
慢动作:
find . -type f
将搜索当前目录下的所有纯文本文件- 对于每个文件,它将执行一行 bash 命令,
hexdump -n4 $1 | grep -q "^0000000 0000 ffff"
如果文件以以下内容开头,则返回 000 00 FF FF
find
如果以 rc=0 开头的命令-exec
没有返回,则跳到下一个文件,否则它将继续执行针对该文件的过滤器或操作,下一个是-delete
只有前一个过滤器没有失败时才执行的。
您可以使用此功能来尝试该技术,而无需删除文件并显示其名称:
find . -type f -exec bash -c 'hexdump -n4 $1 | grep -q "^0000000 0000 ffff"' Anything {} \; -exec printf "Would delete: %s\n" {} \;