我在用着find
分析文件列表。我希望它能够识别不是 ASCII 文件的文件。
这就是我在命令行上尝试过的:
for me in `find 2022*`; do file -i $me | grep -L 'ascii' ; done;
输出:
(standard input)
(standard input)
(standard input)
(standard input)
(standard input)
(standard input)
(standard input)
的数量standard input
(7)正确地表明它实际上从提交的 200 个文件中找到了正确的文件,但我需要文件本身的名称。
我该怎么做呢?
答案1
file
已经打印了文件名,你必须在简单的 grep 之后剪切它。如果您的文件位于同一目录中:
file -i * | grep -v 'charset.*ascii' | cut -d: -f1
如果您将文件匹配到更多子目录、bash
shell 中:
shopt -s globstar
file -i 2022** | grep -v 'charset.*ascii' | cut -d: -f1
或者使用find
:
find 2022* -type f -exec sh -c 'file -i "$@" | grep -v 'ascii' | cut -d: -f1' sh {} +
有一些边缘情况,最有可能的可能是文件名中的冒号(:
用于file
将grep
文件名与其余文件分开)或带有换行符的文件名或文件名匹配charset.*ascii
但文件不是 ascii。这是处理这些情况的另一个版本(假设支持空分隔):
file -00i * | awk -v RS='\0' -v ORS='\n' 'NF%2{f=$0;next} !/ascii/{print f}'
file
with-00
在文件名末尾和行末尾放置一个空字节。所以我们只测试偶数行,如果不匹配,我们打印上一行(文件名)。
答案2
您将数据通过管道传输到 grep 的标准输入中,因此 grep 没有要打印的文件名。
我假设2022*
是文件名,而不是目录。
find . -type f -name '2022*' -exec sh -c '
for file; do
file -bi "$file" | grep -q ascii || echo "$file"
done
' sh '{}' +