有没有办法找到只包含非打印字符的文件?

有没有办法找到只包含非打印字符的文件?

我的程序运行得很糟糕,并且创建了许多只有几个非打印字符的文件。如果我要抓取这些文件,我什么也看不到(因为它们是非打印字符)。但是,如果我使用类似-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 字节

相关内容