「出力がパイプに入る」オーバーフローを解決するには?非同期パイプは存在しますか?私のコマンド: "ls -l *.htm | wc -l"が失敗します。

「出力がパイプに入る」オーバーフローを解決するには?非同期パイプは存在しますか?私のコマンド: "ls -l *.htm | wc -l"が失敗します。

私のディレクトリは多くのファイルでいっぱいです。どんな種類なのか、なぜそんなに多くなのか気になります。

いくつかのコマンドを試してみると、次のことが起こります。

ls -l | wc -l
1514340

ls | head -n 4
2004112700001.htm
2004112700002.htm
2004112700003.htm
2004112700004.htm

ls *.xml | head -n 4
20041127.xml
20041225.xml
20050101.xml
20050108.xml

ls -l *.htm | wc -l
bash: /bin/ls: Liste d'arguments trop longue
0

# Any other kind of ls command with *.htm, *.* is failing too.

分析を開始するには、wc -l出力が完全に完了するのを待つ必要があることを知っています。ls -l *.htm出力が大きすぎて失敗しました。

本当ですか?

この場合、lsコマンドを一緒に操作する良い方法は何ですかwc -lwc出力が完全に完了する前にコマンドが非同期的に開始されるように要求する方法はありますか?

答え1

rm *を使用してディレクトリ内の何百万ものファイルを削除しようとすると、同じ問題が発生します。私はシステムが見つけたすべてのファイル名でコマンドを「拡張」していると思いますが、それは余裕がありません。

代わりに「検索」を使用することをお勧めします。

find . -mindepth 1 -maxdepth 1 -name "*.html" | wc -l

関連情報