如何获得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 
 find . -name '*.ear' -exec ls -lh {} \; 

只是从jer.drab.org的答复额外的h。 节省时间精神转换为MB;)

您需要使用-exec或-printf。 Printf的工作原理是这样的:

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

-execfunction更强大,可以执行任意命令 – 所以你可以使用'ls'或'wc'的版本来打印文件名以及其他信息。 'man find'会向你展示printf的可用参数,它可以做的不仅仅是文件大小。

-printf不是官方的POSIX标准,所以检查一下你的版本是否支持它。 然而,大多数现代系统将使用GNU查找或类似的扩展版本,所以很有可能会被实现。

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

 find . -name \*.ear -ls 

这给你在正常的“ls -l”格式的每个条目。 或者,为了得到你想要的具体输出,这个:

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

这将给你的文件名后面的大小以KB为单位。

用gnu找,我想这就是你想要的。 它find所有真实的文件,而不是目录(-type f),并为每个文件打印文件名(%p),制表符(\ t),大小(千字节),后缀“KB”,然后换行符(\ n)。

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

如果printf命令没有按照你想要的方式格式化,你可以使用exec,然后在每个文件上执行你想要执行的命令。 使用{}作为文件名,并用分号(;)终止命令。 在大多数炮弹上,所有这三个angular色都应该用反斜杠进行转义。

下面是一个简单的解决scheme,它使用“ls -lh”查找并打印出来,它将以可读的forms显示大小(k表示千字节,M表示兆字节):

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

作为另一种select,“wc -c”将打印文件中的字符数(字节数):

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

这只给你文件大小,而不是所有不必要的东西。

Awk可以修正输出结果,只是提问者提出的问题。 在我的Solaris 10系统上,find-ls作为第二个字段以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 

我在Mac OS X上苦苦寻找find命令不支持-printf

我find的一个解决scheme,无可否认地依赖于所有“员工”文件的“组”。

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

这将ls长输出分成三个标记

  1. 之前的文字“工作人员”
  2. 文件大小
  3. 文件名

然后输出令牌2和3,即输出是字节数,然后是文件名

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

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

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

在Mac上运行

 $ find。  -name“test *”-exec du -sh {} \;
 4.0K ./test1
 0 ./test2
 0 ./test3
 0 ./test4
 $

Scripter世界参考

这应该让你find你想要的,包括格式(即文件名第一和大小之后):

 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 

尝试以下命令:

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 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 
 find . -name "*.ear" -exec ls -l {} \;