- 締切済み
findの結果をlsで詳細表示
はじめまして。 Linux初心者です。 カレントディレクトリ以下のディレクトリやファイルの一覧を詳細表示するには「find ./ | xargs ls -lF」などとすると思いますが xargsを使用せずに「find ./ | ls -lF」とすると、なぜNGなのでしょうか。「xargs」の意味を調べると、 (1) 標準入力から空白か改行で区切られた文字列群を読み込む。 (2) xargsの引数のコマンドの後ろに、標準入力から受け取った文字列群を付け足して、そのコマンドを実行する。 とありました。上記の説明で「xargs」を付けることによる効果はわかるのですが、ls以外のコマンドを使用する際にもfindと組み合わせる際には、 すべてのコマンドで「xargs」を使用しなければいけないのでしょうか。 lsの結果をmoreする際などには、「ls | more」で良いと思うのですが、 「ls | xargs more」としない理由がわかりません。 どなたかわかりやすく教えて頂ければ幸いです。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- winarrow07
- ベストアンサー率41% (143/346)
findの結果が多すぎると、lsの引数リストエラーになるからではないでしょうか?(引数にも上限がある) Argument list too longエラー。 findの-excを使ってもいいと思いますが、これだと例えばfindの結果が5000ファイルヒットしたら5000回lsを行うことになります。 xargsを使うと許容を超えない個数のファイル名(引数)を渡して、必要最低限の回数だけ実行してくれます。 例えばfindの結果5000ファイルを一気に引数に取れなくても500ファイルずつ、10回lsを実行など。
ls は標準入力を受けて結果を返すコマンドではないからです。ls を使うときは、 ls my_file などと使います。引数が無い場合は現在のディレクトリを表示することになっているので、パイプラインは無視されます。 反対に、more は標準入力を受けることができます。 cat my_file | more のようにパイプラインからの標準入力があると、more はちゃんとそれを表示するように処理してくれます。もちろん more my_file と書くこともできます。 xargs の役割は、 echo file1 file2 | xargs ls などとあったときに ls file1 file2 というふうに値を引数として受け渡しするためのものです。 echo file1 file2 | xargs more だったら more file1 file2 と解釈されます。 echo file1 file2 | more との違いを実験してみてください。
- osamuy
- ベストアンサー率42% (1231/2878)
標準入出力とリダイレクト、パイプライン処理についての理解が足りないのでは。 lsの挙動は、さらにシェルのコマンドライン引数の処理の仕方についての理解が必要ですが。 ここらへんコマンドの使い方レベルの勉強法だと理解しにくいところがあるので、Linuxのプロセス生成など内部的なことについて勉強しといたほうが理解が速まると思います。 >すべてのコマンドで「xargs」を使用しなければいけないのでしょうか。 そんなことはないかと。 xargsの代わりに-exec使うとか、while readする手もあります。 >「ls | xargs more」としない理由がわかりません。 「lsの結果をmoreする」という自分のしたい事に合わないからですね。 いやもしかすると、xargs moreこそが、本当にしたかったことなのかもしれませんが。