web-dev-qa-db-ja.com

「検索」でファイルを検索し、ファイルのサイズを表示します

ファイルのサイズを確認しながら、同時にファイルを見つけるにはどうすればよいですか?エラー:このコマンドを試しましたが、他のファイルのサイズと詳細しか取得できませんでした。

find -name "*.conf" | ls -l
5
user831837

findには-lsオプションがあります。したがって、コマンドは次のようになります。

find -name '*.conf' -ls
12
Lienhart Woitok

オプションは、-printfで独自の形式を指定します。たとえば、これは、ファイルサイズ、スペース、ファイル名の順に出力します(相対パス付き):

find -name "*.conf" -printf "%s %p\n"

面白いファイル名(改行を含むファイル名など)が予想される場合に、findの出力レコードをNULで分離する場合は、\0の代わりに\nでフォーマット文字列を終了できます。


レコードについては、findからの出力をlsへの入力にパイプしようとしているため、質問に示されている試みは機能しません。 lsはSTDINからの入力を読み取らないため、findからの出力は単純に破棄され、lsは通常どおり現在のディレクトリのコンテンツをリストします。

7
Digital Trauma

他の答えはすでに指摘しています

  1. findのみを使用して、-printfを使用してファイルサイズを出力する方法
  2. -lsを使用して、lsのみでfind出力を取得する方法
  3. findの出力をxargsで別のプログラムに適切にパイプする方法

ただし、最初と2番目のアプローチではls -lの正確な出力が得られず(-lsフラグはls -dilsと等しくなります)、3番目のアプローチでは追加のxargs呼び出しが必要です。 -execフラグを使用すると、findから直接ls -lを呼び出すことができます。

find -name "*.conf" -exec ls -l {} +

これにより、ls -lの引数としてファイル名のリスト全体が提供され、必要な回数だけ呼び出されます。


現在のディレクトリ内およびその下の.confで終わるすべてのファイルと一致させたい場合(および ARG_MAX は問題ではありません!)、実際には必要ありませんfind at all。代わりに、次のようにbashglobstarシェルオプションでdotglobのグロブマッチングを使用できます。ファイル名の改行で中断せず、findのような「隠しファイル」と一致することも同様に賢明です:

$ shopt -s globstar dotglob
$ ls -l **/*.conf
4
dessert

lsは標準入力からファイルのリストを取得せず、それらが引数であることを期待します。 xargsコマンドは、入力を引数に変換するための一般的な機能です。

find -name '*.conf' | xargs ls -l

ただし、これは入力を空白で分割するため、名前にスペースが含まれていると問題が発生する可能性があります。 findxargsには、これを緩和するために連携するオプションがあります。

find -name '*.conf' -print0 | xargs -0 ls -l

xargs-0オプションは、入力のパラメーター間の区切り文字としてヌルバイトを使用するように指示し、-print0findにヌルバイトで区切られた名前を出力するように指示します改行の代わりに。

3
Barmar