次のように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
find . -name '*.ear' -exec ls -lh {} \;
jer.drab.orgの返信からhだけを追加しました。精神的にMBに変換する時間を節約します;)
-execまたは-printfを使用する必要があります。 Printfは次のように機能します。
find . -name *.ear -printf "%p %k KB\n"
-execはより強力で、任意のコマンドを実行できます。したがって、「ls」または「wc」のバージョンを使用して、他の情報とともにファイル名を出力できます。 'man find'は、printfに使用可能な引数を表示します。printfは、単なるファイルサイズ以上のことができます。
[編集] -printfは公式のPOSIX標準ではないため、ご使用のバージョンでサポートされているかどうかを確認してください。ただし、最新のシステムのほとんどはGNU findまたは同様の拡張バージョンを使用するため、実装される可能性は十分にあります。
簡単な解決策は、findで-lsオプションを使用することです。
find . -name \*.ear -ls
これにより、通常の「ls -l」形式の各エントリが得られます。または、探していると思われる特定の出力を取得するには、次のようにします。
find . -name \*.ear -printf "%p\t%k KB\n"
これにより、ファイル名の後にKB単位のサイズが表示されます。
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 \{\} \;
find . -name '*.ear' -exec du -h {} \;
これにより、不要なものすべてではなく、ファイルサイズのみが得られます。
du -aを使用しない理由例えば。
find . -name "*.ear" -exec du -a {} \;
Macで動作します
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
Findコマンドが-printf
をサポートしていないMac OS Xではこれに苦労しました。
私が見つけた解決策は、明らかに「スタッフ」であるすべてのファイルの「グループ」に依存しています...
ls -l -R | sed 's/\(.*\)staff *\([0-9]*\)..............\(.*\)/\2 \3/'
これにより、ls long出力が3つのトークンに分割されます
そして、トークン2と3を出力します。つまり、出力はバイト数で、次にファイル名です
8071 sections.php
54681 services.php
37961 style.css
13260 thumb.php
70951 workshops.php
これにより、探しているものが得られ、フォーマットが含まれます(つまり、最初にファイル名、その後サイズ):
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
$ find。 -name "test *" -exec du -sh {} \; 4.0K ./test1 0 ./test2 0 ./test3 0。 /test4 $
これを試すことができます:
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
find . -name "*.ear" | xargs ls -sh
次のコマンドを試してください。
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 < {})"' ';'
find . -name "*.ear" -exec ls -l {} \;