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


106

次のように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

回答:


109
find . -name '*.ear' -exec ls -lh {} \;

jer.drab.orgの返信からのhエキストラだけです。精神的にMBに変換する時間を節約できます;)


8
このバージョンは、各ファイルに対して「ls」プロセスを実行します。多くのファイル(たとえば、1,000以上)がある場合は、find . -name '*.ear' -exec ls -lh {} + \;(GNU拡張)またはの いずれかでファイルを最適化します find . -name '*.ear' -print0 | xargs -0 ls -lh。また-type f、ファイルのみに関心がある場合は追加することもできます(または-d、コンテンツなしでディレクトリ自体を含めたい場合はlsに追加します)。
ash108 2012年

2
あなたの答えはディレクトリを除外しないので、ディレクトリでもlsを実行することになり、これは明らかに正しいことではありません。
Faheem Mitha、2014年

2
これは非常に非効率的な方法です。残念ながら、ash108のコメントも理想的ではありません。-printfオプションを使用して検索する方がはるかに優れています。
oskarpearson

dmazzoniの答えは、すべてのファイルでfork + execを回避するため(マシンで100倍高速)、はるかに効率的です。%kを%sに変更する必要がありました。@FaheemMitha:-type f通常のファイルのみをカウントするなどのオプションを追加できます。
Fooz氏、16

@FaheemMithaの簡単なソリューションはfind . -name "*.ear" -type fファイル用です。-type dディレクトリで機能します。
anon58192932

111

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

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

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

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


あなたの例はより正確に見えるようですが、Solaris 10で動作させる例を示すことができないようです
Brian

Solarisのfindが-printfをまったくサポートしていないようです。jrwren.wrenfam.com / blog / 2006/10/07 / solaris - find - sucks cs.bgu.ac.il/~arik/usail/man/solaris/ find.1.html煩わしい 場合はGNU findをインストールできます。そうでない場合は、execまたは|を使用する必要があります。他の人が示唆したように。
リーコールドウェル

1
+1これはよりクリーンに見えます。出力をフォーマットするには、add columnコマンドを使用します。find . -name *.ear -printf "%p %k KB\n" | column -t
Amol

1
この回答は受け入れ答えよりも、それを行うにははるかに正しい方法である
威嚇

2
この-printfオプションはOS Xでも機能しません。stackoverflow.com/questions/752818/…を参照してください。
abeboparebop 2016年

33

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

find . -name \*.ear -ls

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

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

これにより、ファイル名の後にサイズ(KB)が続きます。


lsオプションさえ知らなかったので、これは答えのリストで実際よりもはるかに高いはずです。
プロメテウス

24

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 \{\} \;

+1 -name '*.ear'例で省略されていることを除いて、これが一番の答えになるはずです。質問に正確に答え、構文の意味を説明し、複数の選択肢を提供します。
OsakaWebbie 2017

すべての行に対して新しいコマンドを実行しないため、これは受け入れられるはずです。したがって、現在受け入れられているshyamからのコマンドよりもはるかに高速です
jirislav

確かに、これは正しい答えです。また、find . -type f -printf '%k KB\t %p\n'ファイルサイズを最初に印刷すると、配置が原因で、書式設定の点でより良い出力になる可能性が高くなります。
myradio

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

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


wcバイト単位のサイズが必要な場合は、これでうまく機能します。
Alex

4

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

なぜdu -aを使わないのですか?例えば

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

Macで動作します


3

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

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

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

1
知っておくと役立ちますfindbrew install findutils
。GNU

2

これはあなたが探しているものを含み、フォーマットが含まれているはずです(つまり、最初にファイル名、その後にサイズ):

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

1

あなたはこれを試すことができます:

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

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

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 < {})"' ';'


0

合計サイズを取得する必要がある場合、ここにスクリプトの提案があります

#!/bin/bash
totalSize=0

allSizes=`find . -type f -name *.ear -exec stat -c "%s" {} \;`

for fileSize in $allSizes; do
    totalSize=`echo "$(($totalSize+$fileSize))"`
done
echo "Total size is $totalSize bytes"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.