如果我发出 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"

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

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

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

find . -name \*.ear -ls

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

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

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

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

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 \{\} \;
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

为什么不使用 杜阿 ?例如。

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

适用于 Mac

我在 Mac OS X 上遇到了这个问题,因为 find 命令不支持 -printf.

我发现的一个解决方案,承认所有文件都是“工作人员”,依赖于“组”......

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

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

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

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

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

这应该会为您提供您正在寻找的内容,包括格式(即文件名在前,大小在后):

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 -exec du {} \;

这将为您提供以字节为单位的大小。但 du 命令还接受参数 -k(代表 KB)和 -m(代表 MB)。它会给你一个类似的输出

5000  ./dir1/dir2/earFile1.ear
5400  ./dir1/dir2/earFile2.ear
5400  ./dir1/dir3/earFile1.ear
find . -name "*.ear" | xargs ls -sh
$ find . -name "test*" -exec du -sh {} \;
4.0K    ./test1
0       ./test2
0       ./test3
0       ./test4
$

脚本世界参考

尝试以下命令:

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 ls -l {} \;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top