私のディレクトリには約500万のテキストファイルがあります。すべて同じ形式です(特別なものはなく、1行に整数を含むプレーンテキストファイルのみがあります)。これらすべてのファイルの最大行と最小行数を計算したいと思います。
まず、次のようにすべての行番号を作成してみました。 (その後、このリストで最小値と最大値を見つける方法を練習しました。)
wc -l `find /some/data/dir/with/text/files/ -type f` > report.txt
しかし、これによりエラーが発生しました。
bash: /usr/bin/wc: Argument list too long
たぶん、この問題を解決するより良い方法がありますか?
たぶんGNU-Parallelはここで助けることができますか?
ベストアンサー1
これを使用してfind
ファイルのリストを作成し、引き続きパイピングできます。これにより、シェルが単一のコマンドで500万のファイル名をすべて拡張しようとするのを防ぎます。
LC_ALL=C find -type f -exec wc -l {} + |
awk '
$2 != "total" {
if (max=="" || $1>max) {max=$1; mxf=$2};
if (min=="" || $1<min) {min=$1; mnf=$2};
}
END { printf "Min %d for %s, max %d for %s\n", min, mnf, max, mxf }
'
find
リストを作成するファイル名の計算awk
、スクリプトに渡されます。これは順番に最大値と最小値だけでなく、ファイル名を見つけて報告するのも難しい作業です。
この単純なコードは、スペースや印刷できない文字を含むファイル名を処理しません。