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


    推荐阅读

      linux获取地址命令?

      linux获取地址命令?,地址,网络,信息,系统,设备,终端,命令,中心,管理,数字,lin

      linux的u盘启动命令?

      linux的u盘启动命令?,系统,电脑,工具,信息,软件,网上,名称,工作,设备,通用,从

      linux设置路由器命令?

      linux设置路由器命令?,网络,信息,代码,地址,电脑,工作,环境,系统,密码,路由,l

      基本linux命令面试题?

      基本linux命令面试题?,系统,情况,设备,实时,工具,分析,证书,时间,教育,认证,

      linux命令连接光驱?

      linux命令连接光驱?,系统,位置,设备,数据,电脑,服务,资料,盘中,智能,管理,Lin

      linuxlspv命令?

      linuxlspv命令?,系统,管理,软件,产品,统一,发行,技术,情况,环境,实时,aix查看

      linux下分区命令行?

      linux下分区命令行?,系统,工具,设备,信息,分区,情况,首次,名称,网络,命令,lin

      u进入linux命令行?

      u进入linux命令行?,系统,地址,服务,电脑,命令,管理,工作,首页,终端,目录,linu

      更改时间linux命令?

      更改时间linux命令?,时间,系统,命令,环境,网上,信息,资料,概念,位置,终端,lin

      linux命令行更改中文?

      linux命令行更改中文?,系统,环境,管理,国家,信息,软件,文化,设备,中文,命令,l

      linux打包zip命令?

      linux打包zip命令?,时间,文件,信息,名称,系统,技术,命令,文件夹,格式,目录,li

      linux的vsp命令?

      linux的vsp命令?,手机,系统,软件,状态,信息,设备,发行,平台,电脑,工作,如何在

      linux关机命令及例子?

      linux关机命令及例子?,系统,信息,命令,时间,代码,用户,表示,指令,方式,提示,l

      linux命令行模式清页?

      linux命令行模式清页?,工作,系统,命令,信息,地址,目录,内容,文件,操作,功能,l

      linux更改账户名命令?

      linux更改账户名命令?,密码,系统,代码,命令,基础,信息,软件,用户,用户名,账

      linux通常重启命令?

      linux通常重启命令?,系统,工作,设备,标准,网络,命令,服务,首要,意义,参数,lin

      linux删除第一行命令?

      linux删除第一行命令?,单位,系统,命令,标的,不了,数字,连续,名称,档案,文件,m

      linux运维命令必会吗?

      linux运维命令必会吗?,工作,系统,地址,基础,网络,人员,信息,技术,软件,环境,

      linux文件io命令?

      linux文件io命令?,系统,设备,时间,地址,平均,信息,服务,工具,报告,网络,嵌入

      linux命令行出现笑脸?

      linux命令行出现笑脸?,系统,图片,资料,电子,信息,不了,工作,时间,文件,命令,l