「find」ファイルを繰り返し、「grep」を使用して文字セットの結果をファイルとして保存する(stdin)

「find」ファイルを繰り返し、「grep」を使用して文字セットの結果をファイルとして保存する(stdin)

私はそれを使用しています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シェル内でファイルをより多くのサブディレクトリと一致させる場合:

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

ファイル名にコロン(ファイル名を残りのファイルから分離する:ために使用されます)、または改行文字を含むファイル名またはファイル名が一致しますが、ファイルがASCIIではない場合があります。これらのケースを処理する他のバージョンは次のとおりです(Null分離がサポートされていると仮定)。filegrepcharset.*ascii

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

filewith は、-00ファイル名の末尾と行末にヌルバイトを配置します。そのため、偶数行だけをテストし、一致するものがない場合は前の行(ファイル名)を印刷します。

おすすめ記事