列出某个目录中特定扩展名的所有文件

10
假设我想列出一个目录,包括子目录中的所有 php 文件,我可以在 bash 中运行以下命令:

ls -l $(find . -name *.php -type f)

这种方法的问题是,如果没有 php 文件,则会执行 ls -l 命令,而不是没有任何输出。
这是个问题,因为我正在尝试获取所有 php 文件的组合大小,使用以下命令:

ls -l $(find . -name *.php -type f) | awk '{s+=$5} END {print s}'

当没有与 *.php 模式匹配的文件时,该命令会返回所有条目的大小。
如何防止出现这种情况?

可能是重复的问题:如何在目录中找到所有文件扩展名? - jww
3个回答

19

我建议你首先搜索文件,然后执行ls -l (或其他命令)。例如像这样:

我建议您首先搜索文件,然后执行ls -l(或其他类似命令)。例如:

find . -name "*php" -type f -exec ls -l {} \;

然后您可以使用管道符将 awk 表达式连接起来进行加法运算。


啊,谢谢。我之前用的是 find . -name "*.php" -type f | xargs ls -l,但是遇到了同样的问题。 - Ayush
大多数情况下,在find之后不需要使用管道符号xargsexec命令可以提供此功能。请注意,必须使用“{}”来引用find找到的文件名。 - fedorqui

8
如果您想避免解析ls以获取总大小,您可以这样说:
find . -type f -name "*.php" -printf "%s\n" | paste -sd+ | bc

这也很酷。我甚至不知道pastebc的存在。 - Ayush

1
这里还有另一种方法,使用du命令:
find . -name "*.php" -type f -print0 | du -c --files0-from=- | awk 'END{print $1}'

太酷了,我在du命令后面加上了-h参数,结果以MB为单位显示,正是我所需要的。谢谢! - Packet Tracer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接