循环遍历“find”文件和“grep”到文件字符集结果(标准输入)

循环遍历“find”文件和“grep”到文件字符集结果(标准输入)

我在用着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

如果您将文件匹配到更多子目录、bashshell 中:

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 {} +

有一些边缘情况,最有可能的可能是文件名中的冒号(:用于filegrep文件名与其余文件分开)或带有换行符的文件名或文件名匹配charset.*ascii但文件不是 ascii。这是处理这些情况的另一个版本(假设支持空分隔):

file -00i * | awk -v RS='\0' -v ORS='\n' 'NF%2{f=$0;next} !/ascii/{print f}'

filewith-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 '{}' +

相关内容