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