关于unix:如何获取find命令以打印出带有文件名的文件大小?

关于unix:如何获取find命令以打印出带有文件名的文件大小?

How do I get the find command to print out the file size with the file name?

如果我发出find命令,如下所示:

1
$ find . -name *.ear

它输出:

1
2
3
./dir1/dir2/earFile1.ear
./dir1/dir2/earFile2.ear
./dir1/dir3/earFile1.ear

我要"打印"到命令行的是名称和大小:

1
2
3
./dir1/dir2/earFile1.ear  5000 KB
./dir1/dir2/earFile2.ear  5400 KB
./dir1/dir3/earFile1.ear  5400 KB

您需要使用-exec或-printf。 Printf的工作方式如下:

1
2
find . -name *.ear -printf"%p %k KB
"

-exec功能更强大,可让您执行任意命令-因此您可以使用'ls'或'wc'版本来打印出文件名以及其他信息。" man find"将向您显示printf的可用参数,它不仅可以执行文件大小操作,还可以做更多的事情。

[edit] -printf不在官方POSIX标准中,因此请检查您的版本是否支持它。但是,大多数现代系统将使用GNU find或类似的扩展版本,因此很有可能实现它。


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

只是jer.drab.org的回复中的h。节省了转换为MB的时间;)


一个简单的解决方案是在find中使用-ls选项:

1
find . -name \*.ear -ls

这样就为您提供了常规" ls -l"格式的每个条目。或者,要获得您似乎正在寻找的特定输出,请执行以下操作:

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

这将为您提供文件名,后跟KB大小。


使用gnu find,我认为这就是您想要的。它查找所有实际文件,而不是目录(-f型),并为每个文件打印文件名(%p),制表符( t),以千字节为单位的大小(%k),后缀" KB",然后换行符( n)。

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

如果printf命令未按照所需的格式设置内容,则可以使用exec,然后使用要在每个文件上执行的命令。使用{}作为文件名,并以分号(;)终止命令。在大多数shell上,所有这三个字符都应使用反斜杠转义。

这是一个简单的解决方案,使用" ls -lh"查找并打印出来,它将以人类可读的形式显示大小(k表示千字节,M表示兆字节):

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

作为另一种选择," wc -c"将打印文件中的字符数(字节):

1
find . -type f -exec wc -c \{\} \;

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

这仅给您文件大小,而不是所有不必要的内容。


为什么不使用du -a?例如。

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

在Mac上运作


Awk可以修正输出,以提供提问者要求的内容。在我的Solaris 10系统上,找到-ls打印大小(KB)作为第二个字段,因此:

1
2
3
4
% 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并从输出中选择size字段。
再次在Solaris 10上:

1
2
3
4
% 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

我在Mac OS X上为此苦苦挣扎,因为其中的find命令不支持-printf

我发现的一个解决方案是,所有文件都是"工作人员",它依赖于"组" ...

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

这将ls long输出分为三个令牌

  • 文字" staff"之前的内容
  • 文件大小
  • 文件名
  • 然后输出令牌2和3,即输出是字节数,然后是文件名

    1
    2
    3
    4
    5
    8071 sections.php
    54681 services.php
    37961 style.css
    13260 thumb.php
    70951 workshops.php

    这应该可以为您提供所需的信息,包括格式(即,首先显示文件名,然后显示大小):

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

    示例输出(我使用-iname"*.php"来获得一些结果):

    1
    2
    3
    4
    5
    6
    7
    ./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

    尝试以下命令:

    GNU stat

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

    BSD stat

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

    但是stat不是标准的,因此duwc可能是更好的方法:

    1
    find . -type f -name *.ear -exec sh -c 'echo"{} $(wc -c < {})"' ';'

    1
    2
    3
    4
    5
    6
    $ find . -name"test*" -exec du -sh {} \;
    4.0K    ./test1
    0       ./test2
    0       ./test3
    0       ./test4
    $

    脚本世界参考


    1
    find . -name"*.ear" | xargs ls -sh

    您可以尝试以下方法:

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

    这将为您提供字节大小。但是du命令还接受参数-k(对于KB)和-m(对于MB)。它会给你类似的输出

    1
    2
    3
    5000  ./dir1/dir2/earFile1.ear
    5400  ./dir1/dir2/earFile2.ear
    5400  ./dir1/dir3/earFile1.ear

    1
    find . -name"*.ear" -exec ls -l {} \;


    推荐阅读