如果我发出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命令,如下所示:
$ 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:
find . -name '*.ear' -exec ls -lh {} \;
只是jer.drab.org的回复中的h。节省了从心理上转换为MB的时间;)
-type f仅计算常规文件的选项。
find . -name "*.ear" -type f针对文件。-type d适用于目录。
您需要使用-exec或-printf。Printf的工作方式如下:
find . -name *.ear -printf "%p %k KB\n"
-exec功能更强大,可让您执行任意命令-因此您可以使用版本的'ls'或'wc'来打印文件名以及其他信息。“ man find”将为您显示printf的可用参数,它不仅可以执行文件大小操作,还可以做更多的事情。
[edit] -printf不在官方的POSIX标准中,因此请检查您的版本是否支持它。但是,大多数现代系统将使用GNU find或类似的扩展版本,因此很有可能实现它。
column命令。find . -name *.ear -printf "%p %k KB\n" | column -t
-printf选项在OS X中也不起作用。参见stackoverflow.com/questions/752818/…。
使用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 \{\} \;
-name '*.ear'在示例中省略之外,这应该是#1答案。它精确地回答了这个问题,解释了语法的含义,并给出了多种选择。
find . -type f -printf '%k KB\t %p\n'即首先打印文件大小,由于对齐的原因,很可能在格式方面是更好的输出。
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
我在不支持find命令的Mac OS X上为此苦苦挣扎-printf。
我发现的一个解决方案肯定是依赖于“组”来处理所有文件“工作人员”,这是...
ls -l -R | sed 's/\(.*\)staff *\([0-9]*\)..............\(.*\)/\2 \3/'
这将ls long输出分为三个令牌
然后输出令牌2和3,即输出是字节数,然后是文件名
8071 sections.php
54681 services.php
37961 style.css
13260 thumb.php
70951 workshops.php
find可通过自制与brew install findutils
这应该可以为您提供所需的信息,包括格式(即,首先是文件名,然后是大小):
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
find . -name "*.ear" | xargs ls -sh
find . -name '*.ear' -exec ls -lh {} + \;(GNU扩展名)或find . -name '*.ear' -print0 | xargs -0 ls -lh。另外,-type f如果您仅对文件感兴趣,则可能要添加(-d如果希望包含目录本身而不包含目录内容,则可以添加到ls中)。