135

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

17 回答 17

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

只是 jer.drab.org 回复中的 h 额外内容。节省在心理上转换为 MB 的时间;)

于 2008-09-15T16:59:16.973 回答
133

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

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

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

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

于 2008-09-15T16:58:42.453 回答
36

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

find . -name \*.ear -ls

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

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

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

于 2008-09-15T16:57:30.223 回答
28

使用 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 \{\} \;
于 2008-09-15T17:08:26.843 回答
10
find . -name '*.ear' -exec du -h {} \;

这只会为您提供文件大小,而不是所有不必要的东西。

于 2014-01-13T21:28:25.137 回答
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 并从输出中选择大小字段。再次在 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
于 2008-10-28T21:14:23.637 回答
4

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

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

在 Mac 上工作

于 2013-01-06T17:34:21.117 回答
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
于 2011-12-03T00:25:52.913 回答
3

尝试以下命令:

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 < {})"' ';'
于 2016-02-01T11:51:34.507 回答
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
于 2014-03-27T14:56:56.123 回答
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
于 2008-09-15T16:56:32.503 回答
1
find . -name "*.ear" | xargs ls -sh
于 2008-09-15T16:57:16.747 回答
1
$查找。-name "test*" -exec du -sh {} \;
4.0K ./test1
0 ./test2
0 ./test3
0 ./test4
$

脚本世界参考

于 2010-01-05T20:37:22.950 回答
1

只需使用磁盘使用命令 ( ) 列出-type f与模式 ( ) 匹配的文件 ( ) 并按人类可读的文件大小 ( ) 对文件进行排序:-name '*.eardu -hsort -h

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

输出

5.0k  ./dir1/dir2/earFile1.ear
5.4k  ./dir1/dir2/earFile2.ear
5.4k  ./dir1/dir3/earFile1.ear
于 2021-11-05T15:32:32.273 回答
0
find . -name "*.ear" -exec ls -l {} \;
于 2008-09-15T16:55:16.673 回答
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"
于 2020-05-26T08:40:25.350 回答
0

你可以试试 for 循环:

for i in `find . -iname "*.ear"`; do ls -lh $i; done
于 2021-05-17T21:48:11.017 回答