web-dev-qa-db-ja.com

ファイル名とともにファイルサイズを出力するfindコマンドを取得するにはどうすればよいですか?

次のようにfindコマンドを発行した場合:

$ find . -name *.ear

それは印刷されます:

./dir1/dir2/earFile1.ear
./dir1/dir2/earFile2.ear
./dir1/dir3/earFile1.ear

コマンドラインに「印刷」したいのは、名前とサイズです。

./dir1/dir2/earFile1.ear  5000 KB
./dir1/dir2/earFile2.ear  5400 KB
./dir1/dir3/earFile1.ear  5400 KB
85
Brian
find . -name '*.ear' -exec ls -lh {} \;

jer.drab.orgの返信からhだけを追加しました。精神的にMBに変換する時間を節約します;)

92
shyam

-execまたは-printfを使用する必要があります。 Printfは次のように機能します。

find . -name *.ear -printf "%p %k KB\n"

-execはより強力で、任意のコマンドを実行できます。したがって、「ls」または「wc」のバージョンを使用して、他の情報とともにファイル名を出力できます。 'man find'は、printfに使用可能な引数を表示します。printfは、単なるファイルサイズ以上のことができます。

[編集] -printfは公式のPOSIX標準ではないため、ご使用のバージョンでサポートされているかどうかを確認してください。ただし、最新のシステムのほとんどはGNU findまたは同様の拡張バージョンを使用するため、実装される可能性は十分にあります。

94
Leigh Caldwell

簡単な解決策は、findで-lsオプションを使用することです。

find . -name \*.ear -ls

これにより、通常の「ls -l」形式の各エントリが得られます。または、探していると思われる特定の出力を取得するには、次のようにします。

find . -name \*.ear -printf "%p\t%k KB\n"

これにより、ファイル名の後にKB単位のサイズが表示されます。

21
Michael Cramer

Gnu findを使用して、これがあなたが望むものだと思います。ディレクトリではなく、すべての実ファイルを検索し(-type f)、ファイルごとにファイル名(%p)、タブ(\ t)、キロバイト単位のサイズ(%k)、サフィックス "KB"を出力し、改行(\ n)。

find . -type f -printf '%p\t%k KB\n'

Printfコマンドが希望どおりにフォーマットしない場合は、execを使用し、その後に各ファイルで実行するコマンドを続けます。ファイル名に{}を使用し、セミコロン(;)でコマンドを終了します。ほとんどのシェルでは、これらの3つの文字すべてをバックスラッシュでエスケープする必要があります。

「ls -lh」を使用してそれらを見つけて出力する簡単なソリューションを次に示します。サイズを人間が読める形式で表示します(キロバイトはk、メガバイトはM)。

find . -type f -exec ls -lh \{\} \;

さらに別の選択肢として、「wc -c」はファイル内の文字数(バイト)を出力します。

find . -type f -exec wc -c \{\} \;
19
dmazzoni
find . -name '*.ear' -exec du -h {} \;

これにより、不要なものすべてではなく、ファイルサイズのみが得られます。

7
user2121791

du -aを使用しない理由例えば。

find . -name "*.ear" -exec du -a {} \;

Macで動作します

4
Andreas

Awkは出力を修正して、質問者が求めたものだけを表示できます。 Solaris 10システムでは、find -lsは2番目のフィールドとしてサイズをKBで出力します。

% find . -name '*.ear' -ls | awk '{print $2, $11}'
5400 ./dir1/dir2/earFile2.ear
5400 ./dir1/dir2/earFile3.ear
5400 ./dir1/dir2/earFile1.ear

それ以外の場合は、-exec ls -lhを使用して、出力からサイズフィールドを選択します。再びSolaris 10で:

% find . -name '*.ear' -exec ls -lh {} \; | awk '{print $5, $9}'
5.3M ./dir1/dir2/earFile2.ear
5.3M ./dir1/dir2/earFile3.ear
5.3M ./dir1/dir2/earFile1.ear
4
tpgould

Findコマンドが-printfをサポートしていないMac OS Xではこれに苦労しました。

私が見つけた解決策は、明らかに「スタッフ」であるすべてのファイルの「グループ」に依存しています...

ls -l -R | sed 's/\(.*\)staff *\([0-9]*\)..............\(.*\)/\2 \3/'

これにより、ls long出力が3つのトークンに分割されます

  1. テキスト「スタッフ」の前のもの
  2. ファイルサイズ
  3. ファイル名

そして、トークン2と3を出力します。つまり、出力はバイト数で、次にファイル名です

8071 sections.php
54681 services.php
37961 style.css
13260 thumb.php
70951 workshops.php
3
Mike M

これにより、探しているものが得られ、フォーマットが含まれます(つまり、最初にファイル名、その後サイズ):

find . -type f -iname "*.ear" -exec du -ah {} \; | awk '{print $2"\t", $1}'

サンプル出力(ここでは-iname "*.php"何らかの結果を得るために):

./plugins/bat/class.bat.inc.php  20K
./plugins/quotas/class.quotas.inc.php    8.0K
./plugins/dmraid/class.dmraid.inc.php    8.0K
./plugins/updatenotifier/class.updatenotifier.inc.php    4.0K
./index.php      4.0K
./config.php     12K
./includes/mb/class.hwsensors.inc.php    8.0K
2
adriano72
 $ find。 -name "test *" -exec du -sh {} \; 
 4.0K ./test1
0 ./test2
0 ./test3
0。 /test4
$

Scripter Worldリファレンス

1
scripter

これを試すことができます:

find. -name *.ear -exec du {} \;

これにより、サイズがバイト単位で表示されます。ただし、duコマンドは、KBの場合は-kパラメーター、MBの場合は-mパラメーターも受け入れます。次のような出力が得られます

5000  ./dir1/dir2/earFile1.ear
5400  ./dir1/dir2/earFile2.ear
5400  ./dir1/dir3/earFile1.ear
1
Yaba
find . -name "*.ear" | xargs ls -sh
1
killdash10

次のコマンドを試してください。

GNU stat

find . -type f -name *.ear -exec stat -c "%n %s" {} ';'

BSD stat

find . -type f -name *.ear -exec stat -f "%N %z" {} ';'

ただし、statは標準ではないため、duまたはwcの方が適切な方法です。

find . -type f -name *.ear -exec sh -c 'echo "{} $(wc -c < {})"' ';'
1
kenorb
find . -name "*.ear" -exec ls -l {} \;
0
Jeremy Weathers