如何获取find命令以使用文件名打印文件大小?

时间:2008-09-15 16:53:13

标签: unix command-line find solaris

如果我按如下方式发出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

16 个答案:

答案 0 :(得分:92)

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

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

-exec功能更强大,允许您执行任意命令 - 因此您可以使用'ls'或'wc'版本打印出文件名以及其他信息。 'man find'将显示printf的可用参数,这可以做很多文件大小。

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

答案 1 :(得分:89)

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

来自jer.drab.org的回复中的额外内容。节省了精神上转换为MB的时间;)

答案 2 :(得分:21)

一个简单的解决方案是在find:

中使用-ls选项
find . -name \*.ear -ls

以正常的“ls -l”格式为您提供每个条目。或者,要获得您似乎正在寻找的具体输出,请:

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

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

答案 3 :(得分:19)

使用gnu find,我认为这就是你想要的。它找到所有真实文件而不是目录(-type 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 \{\} \;

答案 4 :(得分:7)

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

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

答案 5 :(得分:4)

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并从输出中选择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

答案 6 :(得分:4)

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

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

适用于Mac

答案 7 :(得分:3)

我在Mac OS X上遇到了困难,其中find命令不支持-printf

我发现的一个解决方案,无可否认,所有文件都属于'员工'的'组'是......

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

这会将ls long输出分成三个标记

  1. 文本'staff'之前的内容
  2. 文件大小
  3. 文件名
  4. 然后输出令牌2和3,即输出是字节数,然后是文件名

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

答案 8 :(得分: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

答案 9 :(得分: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

答案 10 :(得分:1)

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

答案 11 :(得分:1)

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

Scripter World reference

答案 12 :(得分: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不是标准的,因此duwc可能是更好的方法:

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

答案 13 :(得分:0)

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

答案 14 :(得分: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"

答案 15 :(得分:0)

你可以试试 for 循环:

for i in `find . -iname "*.ear"`; do ls -lh $i; done