如何获得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

Answers:


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

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


8
此版本将为每个文件执行“ ls”过程。如果您有许多文件(例如,超过一千个),则最好通过以下方法进行优化: 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仅计算常规文件的选项。
福兹先生16年

@FaheemMitha简单的解决方案是find . -name "*.ear" -type f针对文件。-type d适用于目录。
anon58192932 '16

111

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

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

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

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


它看起来像你的例子更精确,但我似乎无法得到例如工作在Solaris 10上
布赖恩

恐怕Solaris查找根本不支持-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这似乎更干净。要格式化输出,我更喜欢添加column命令。find . -name *.ear -printf "%p %k KB\n" | column -t
Amol 2012年

1
这个答案比接受的答案是一种更正确的方法
令人生畏的2015年

2
-printf选项在OS X中也不起作用。参见stackoverflow.com/questions/752818/…
abeboparebop

33

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

find . -name \*.ear -ls

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

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

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


甚至都不知道ls选项,答案列表中的选项应该比它高得多。
普罗米修斯

24

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

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

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

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

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

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

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

+1除了-name '*.ear'在示例中省略之外,这应该是#1答案。它精确地回答了这个问题,解释了语法的含义,并给出了多种选择。
OsakaWebbie

这应该是可以接受的答案,因为它不会在每一行上都运行新命令,因此它比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系统上,找到-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并从输出中选择size字段。再次在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输出分为三个令牌

  1. 文字“ staff”之前的内容
  2. 文件大小
  3. 文件名

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

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

1
有用知道..的GNU版本find可通过自制与brew install findutils
mwfearnley

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命令还接受参数-k(对于KB)和-m(对于MB)。它会给你类似的输出

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"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.