pbi*_*ies 8 command-line text-processing
我试图查找/列出的文件是:
我现在的命令是:
grep -RLP '[^\x00]' .
Run Code Online (Sandbox Code Playgroud)
哪个有效,但它也会找到仅包含两个字节的文件:0xFF、0xFE。不知道为什么。
有没有更好的命令来查找此类文件?
简而言之,这里发生的事情grep是试图将您的文件解释为 Unicode 数据。序列 0xFF, 0xFE 是UTF-16的字节顺序标记。
(在我的测试中,即使涉及两个 0xFF 或两个 0xFE 等的其他序列仍然不匹配'[^\x00]'正则表达式,因为即使在尝试执行 UTF-8 时,这些也会被视为非字符。)
使用不将 Unicode 用于字符类型的语言环境应该可以解决此问题,您可以通过设置LC_CTYPE 环境变量来实现。使用C语言环境强制 ASCII 编码(因此没有启用 Unicode):
LC_CTYPE=C grep -RLP '[^\x00]' .
Run Code Online (Sandbox Code Playgroud)
更新:正如@steeldriver 所指出的,grep 仍然逐行运行,因此包含 NUL 字节和换行符的文件仍将匹配。
@DavidFoerster 使用 grep 的解决方案-z很好地解决了这个问题,使用 NUL 字节作为分隔符可以解决问题。
或者,我想出了一个简短的 Python 3 脚本 ( allzeroes.py) 来检查文件的内容是否全为零:
#!/usr/bin/python3
import sys
assert len(sys.argv) == 2
with open(sys.argv[1], 'rb') as f:
for block in iter(lambda: f.read(4096), b''):
if any(block):
sys.exit(1)
Run Code Online (Sandbox Code Playgroud)
您可以在 a 中使用它find来递归定位所有匹配项:
$ find . -type f -exec allzeroes.py {} \; -print
Run Code Online (Sandbox Code Playgroud)
我希望这有帮助。
| 归档时间: |
|
| 查看次数: |
1215 次 |
| 最近记录: |