这一个班轮是使用GNU找到100%NUL文件的最有效的方式find
,xargs
和grep
(假设后者是建立与PCRE支持):
find . -type f -size +0 -readable -print0 |
LC_ALL=C xargs -r0 grep -LP "[^\x00]" --
与其他提供的答案相比,此方法的优点是:
- 非稀疏文件包含在搜索中。
- 不可读的文件不会传递给grep,从而避免出现
Permission denied
警告。
grep
找到任何非null字节后将停止从文件中读取数据(LC_ALL=C
用于确保每个字节都被解释为字符)。
- 空文件(零字节)不包括在结果中。
- 较少的
grep
进程可以有效地检查多个文件。
- 包含换行符或开头的路径
-
已正确处理。
- 适用于大多数缺少Python / Perl的嵌入式系统。
将-Z
选项传递给grep
和使用xargs -r0 ...
允许对100%nul文件执行进一步的操作(例如:清理):
find . -type f -size +0 -readable -print0 |
LC_ALL=C xargs -0 grep -ZLP "[^\x00]" -- |
xargs -r0 rm --
我还建议使用find
选项-P
以避免遵循符号链接,并且-xdev
避免遍历文件系统(例如:远程挂载,设备树,绑定挂载等)。
为了忽略行尾字符,应使用以下变体(尽管我认为这不是一个好主意):
find . -type f -size +0 -readable -print0 |
LC_ALL=C xargs -r0 grep -LP "[^\x00\r\n]" --
将所有内容放在一起,包括删除不需要的文件(100%nul /换行符)以防止对其进行备份:
find -P . -xdev -type f -size +0 -readable -print0 |
LC_ALL=C xargs -0 grep -ZLP "[^\x00\r\n]" -- |
xargs -0 rm --
我不建议包含空文件(零字节),它们通常出于非常 特定的 目的而存在。