如何查找内容中含有 100% NUL 字符的文件?

如何查找内容中含有 100% NUL 字符的文件?

可以识别此类文件的Linux命令行命令是什么?

AFAIKfind命令(或grep)只能匹配文本文件中的特定字符串。但我想匹配整个内容,即我想查看哪些文件匹配正则表达式\0+忽略行结束符。也许这个find . cat | grep习惯用法可以工作,但我不知道如何使 grep 忽略行(并将文件视为二进制文件)。

背景:每隔几天,当我的笔记本电脑死机时,我的 btrfs 分区就会丢失信息:打开用于写入的文件的内容会被替换为零(文件的大小或多或少保持不变)。我使用同步,并且不希望这些假文件传播:我需要一种方法来识别它们,以便我可以从备份中获取它们。

答案1

您可以grep使用 Perl 正则表达式模式获取 ␀ 字符:

$ echo -ne "\0\0" > nul.bin
$ echo -ne "\0x\0" > non-nul.bin
$ grep -P "[^\0]" *.bin
Binary file non-nul.bin matches

所以你可以使用这个:

for path in *.foo
do
    grep -P "[^\0]" "$path" || echo "$path"
done

答案2

我同意D_Bye关于找到问题根源的说法。

无论如何,要检查文件是否仅包含\0和/或\n您可以使用tr

<file tr -d '\0\n' | wc -c

对于 null/换行符和空文件返回 0。

答案3

我怀疑这些文件是稀疏的,也就是说它们没有分配任何磁盘空间,它们只是指定文件大小(du将为它们报告 0)。

在这种情况下,使用 GNU find,您可以这样做(假设没有文件路径包含换行符):

find . -type f -size +0 -printf '%b:%p\n' | grep '^0:' | cut -d: -f2-

答案4

查找仅包含空字符“\0”和换行符“\n”的文件。
qsed一旦在行中找到任何非空字符,则导致每个文件搜索立即退出。

find -type f -name 'file-*' |
  while IFS= read -r file ;do 
      out=$(sed -n '1=; /^\x00\+$/d; i non-null
                      ; q' "$file")
      [[ $out == "1" ]] &&  echo "$file"
  done

制作测试文件

> file-empty
printf '%s\n' 'line1' 'line2' 'line3'      > file-with-text           
printf '%4s\n' '' '' xx | sed 's/ /\x00/g' > file-with-text-and-nulls
printf '%4s\n' '' '' '' | sed 's/ /\x00/g' > file-with-nulls-and-newlines
printf '%4s'   '' '' '' | sed 's/ /\x00/g' > file-with-nulls-only

输出

./file-with-nulls-and-newlines
./file-with-nulls-only

相关内容