如何使用 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
197193 次浏览
find . -name "*.ear" -exec ls -l {} \;

你可以试试这个:

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

这将给出以字节为单位的大小。但 du 命令也接受 KB 的参数-k 和 MB 的参数-m。它会给你一个类似

5000  ./dir1/dir2/earFile1.ear
5400  ./dir1/dir2/earFile2.ear
5400  ./dir1/dir3/earFile1.ear
find . -name "*.ear" | xargs ls -sh

一个简单的解决方案是在 找到中使用 是的选项:

find . -name \*.ear -ls

每个条目都采用普通的“ ls-l”格式。或者,为了得到你想要的特定输出,这样做:

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

它将给出文件名,后跟大小(KB)。

您需要使用-exec 或-Printf:

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

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

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

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

只需要 jer.drab.org 的回复中多出的 h 就可以节省转换成 MB 的时间;)

使用 GNU find,我想这就是您想要的。它查找所有真正的文件而不是目录(F 型) ,并且为每个文件打印文件名(% p)、制表符(t)、千字节大小(% k)、后缀“ KB”和换行符(n)。

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

如果 打印命令没有按照您想要的方式格式化,您可以使用 Ref = “ https://linux.die.net/man/1/exec”rel = “ nofollow norefrer”> exec ,然后是您想要对每个文件执行的命令。对文件名使用{} ,并以分号(;)结束命令。在大多数 shell 中,所有这三个字符都应该使用反斜杠进行转义。

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

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

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

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

Awk 可以修改输出,以便提出问题的人能够得到他所要求的结果。在我的 Solaris 10系统中,find-ls 将 size 打印为 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 . -name "test*" -exec du -sh {} \;
4.0K    ./test1
0       ./test2
0       ./test3
0       ./test4
$

参考脚本世界

在 MacOSX 上,find 命令不支持 -printf,我对此感到费解。

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

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

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

  1. 短信“员工”之前的东西
  2. 文件大小
  3. 文件名

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

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

为什么不使用 杜阿

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

在 Mac 上工作

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

这样就只提供了文件大小,而不是所有不必要的东西。

这应该可以得到你想要的东西,包括格式(即文件名首先和大小后) :

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

尝试以下命令:

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 < {})"' ';'

如果您需要得到总大小,这里是一个脚本建议

#!/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"

你可以试试循环:

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

只需使用磁盘使用命令(du -h)列出匹配模式(-name '*.ear)的文件(-type f) ,并按照人类可读的文件大小(sort -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