我的程序运行得很糟糕,并且创建了许多只有几个非打印字符的文件。如果我要抓取这些文件,我什么也看不到(因为它们是非打印字符)。但是,如果我使用类似-empty
或-size 0
的命令,这些文件将不会显示find
。
有谁知道一种搜索仅包含非打印字符的文件的方法?
答案1
使用 GNU grep(以及其他几个 grep 实现),您可以搜索不包含任何可打印字符的文件。该-L
选项表示列出不包含匹配项的文件。[[:print:]]
(是的,有两对括号)匹配一个可打印字符;可打印字符的定义取决于您的区域设置。
grep -L '[[:print:]]' -- *
请注意,这包括空文件(如明达斯指出)。
要删除它们(grep
首先查看输出以确保删除正确的文件),假设文件名不包含任何换行符:
grep -L '[[:print:]]' -- * |
while IFS= read -r filename; do
if [ -f "$filename" ] && [ -s "$filename" ]; then
rm "$filename"
fi
done
或等效(请注意,这也会删除空文件)
set +f; IFS='
' # split at newlines, turn off globbing
rm -- $(set -f; grep -L '[[:print:]]' -- *)
set -f; unset IFS
请注意,如果当前目录中有子目录,上面的命令将产生错误消息(因为您将调用rm
目录 - 不要调用rm -r
!)。在zsh中,您可以使用*(.L+0)
而不是*
仅匹配常规非空文件,并且无需担心文件名中的特殊字符(换行符除外):
IFS=$'\n'
rm -- $(grep -L '[[:print:]]' -- *(.))
unset IFS
仅使用 POSIX 工具,grep -l '[[:print:]]' -- *
显示您要保留的文件(空文件除外)。
或者您可以迭代文件;这更清晰,并且肯定不会对特殊字符造成任何麻烦(但会跳过点文件),但理论上(但可能无法测量)速度较慢。
for x in *; do
if [ -f "$x" ] && [ -s "$x" ] && ! grep -q '[[:print:]]' <"$x"; then
rm -- "$x"
fi
done
答案2
你最好的选择可能是使用file
.尝试这个:
find . -type f -exec file {} + | grep ": data"
现在,这不会捕获在开始时随机碰巧具有正确幻数的文件,但很可能大多数其他方法无论如何都会错过它们。
查找这些文件的其他方法:
- 最后修改时间:
find -mmin 5
= 5 分钟前 - 大小,不一定为零:
find -size -4k
= 小于 4096 字节