ディレクトリには多くのファイルがあります。一部のファイルには1行があり、一部のファイルにはより多くの行があります。
ファイルの行数が2より大きい特定のディレクトリにファイル名(フルパスを含む)を表示しようとしています。
これまで私がしたことは、ディレクトリにファイルを表示することでした。 /abc/def -最大深さ1 -タイプfを探す
答え1
GNUを使用awk
するmawk
そして他のものも、少なくとも3行を含む現在のディレクトリの一般ファイルを一覧表示します。
find . ! -name . -prune -type f -size +2c -exec awk '
FNR==3{print FILENAME; nextfile}' {} +
(ここには終了しない行も含まれています。ファイルにa\nb\nc
2行しか含まれていない場合、a\nb\nc\n
ファイルはまだ3行と見なされますが、wc -l
2行だけが返されます。-size +2c
これは、3行未満のファイルを開いて読み取る最適化をスキップするだけです)。バイト、3行を含めることができないからです)。
これは、行番号を見つけるためにファイル全体を読み取るのではなく、できるだけ少ない数のコマンドを実行し、3行目を確認するとすぐにファイル処理を停止するので効率的です。
シェルがあれば、zsh
次のように短縮できます。
awk 'FNR==3{print FILENAME; nextfile}' ./*(D.L+2)
find . ! -name . -prune
GNU標準と同じですfind . -mindepth 1 -maxdepth 1
(打つ)を除くすべてのディレクトリ.
。
(上記のコードはサポートされていない実装awk
でも機能します。注意してください。コードはファイル全体を読み込み、文は変数参照としてのみ処理されます)。awk
nextfile
nextfile
答え2
grep -Hsc . -- * | sed -n '/:[0-2]$/!s/:.*$//p'
しかし、空の行について考えないでください。計算したい場合:
grep -Hsc '$' -- * | sed '/:[0-2]$/d;s/:.*$//'
答え3
次のコマンドを試してください。
find . -maxdepth 1 -type f \
-exec sh -c 'test $( wc -l {} | cut -f1 -d" " ) -gt "2"' \; -print
$(rm -rf ~)
ディレクトリにいくつかの外部ファイルが見つかった場合、コマンドはそのディレクトリ内のすべてのデータを削除する可能性があるため、注意する必要があります。
find . -maxdepth 1 -type f
現在のディレクトリで深さ1のファイルを検索します。これは、サブディレクトリに移動しないことを意味します。
-exec sh -c
コマンドを実行します。ここでコマンドのスクリプトを実行します。
'test $( wc -l {} | cut -f1 -d" " ) -gt "2"'
各ファイルの行数が2より大きいかどうかを計算するコマンド。
その後、出力を印刷します。