* *とパイプの違い

* *とパイプの違い

特定のディレクトリ内のすべてのファイルのサイズを確認したいとします。

私がしたことは次のとおりです。

du -sh *

または、次のようにすることができます。

ls | xargs du -sh

これら2つのコマンドはまったく同じことを行います。

コスト、効率などがまったく同じかどうかを知りたいです。 (最初のコマンドが2番目のコマンドよりも軽いようですか?)

ベストアンサー1

1つは正しい、もう1つは間違っています。

du -sh *

du -sh -- *ファイル名が次に始まる問題は避けるべきです-

globを拡張するにはシェルを使用してください*du現在のディレクトリにある隠されていないすべてのファイルとディレクトリを別々の引数として扱います。特殊文字を正しく処理します。

ls | xargs du -sh

xargsプロセスの出力によって異なりますlsxargs入力を空白(一部の実装では空白、タブ、改行、一部の実装ではより多く)に分割し、いくつかの形式の引用も理解し、空白で区切られたdu各文字列(空の入力でも)または複数の呼び出しを使用します。 (一度)個別に実行します。買収。

現在のディレクトリに、名前にスペース、一重引用符、二重引用符、またはバックスラッシュ文字を含むファイルが含まれておらず、xargs1回の呼び出しを実行するdu

効率性の観点からdu -sh *1つのプロセスを使用するか、ls | xargs du -sh少なくとも3つのプロセスを使用してください。パイプ方式は機能しますが、globは機能しない場合があります。現在のディレクトリにファイルが多すぎると、シェルはduすべてのファイル名を一度に実行せずに必要な回数だけカウントxargsします。duこの場合、複数行が表示され、複数のハードリンクを持つファイルは複数回数えることができます。

また、見ることができますなぜ`ls`を解析しないのですか?


1現在のディレクトリに隠されていないファイルがない場合、シェルはdu -sh -- *エラーで失敗するか、一部のシェル(bashリテラルを引数として実行しているシェル)はファイルが存在しないと文句を言います。使用されますが、ほとんどの実装(一部のBSDを除く)は引数なしで実行されるため、現在のディレクトリのディスク使用量(したがって、ディレクトリファイル自体とその中にあるすべての隠しファイルとディレクトリのディスク使用量も提供します)を提供します。du*du*

ls | xargs du -sh --xargsdu

おすすめ記事