可以识别此类文件的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”的文件。
在q
sed一旦在行中找到任何非空字符,则导致每个文件搜索立即退出。
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