【问题标题】:List all files in a directory with a certain extension列出具有特定扩展名的目录中的所有文件
【发布时间】:2013-09-20 08:13:34
【问题描述】:

假设我想列出一个目录中的所有 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 模式匹配的文件,则最终返回所有条目的大小。

如何防范此事件?

【问题讨论】:

标签: bash find


【解决方案1】:

我建议您首先搜索文件,然后执行ls -l(或其他任何操作)。比如这样:

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

然后您可以通过管道传递awk 表达式以进行加法。

【讨论】:

  • 啊,谢谢。我之前在做find . -name "*.php" -type f | xargs ls -l,但遇到了同样的问题。
  • 大多数时候没有必要在find 之后通过管道传输xargsexec 命令为您提供了此实用程序。注意{}引用find找到的文件名是必须的。
【解决方案2】:

如果你想避免parsing ls 得到总大小,你可以说:

find . -type f -name "*.php" -printf "%s\n" | paste -sd+ | bc

【讨论】:

  • 这也很酷。我什至不知道pastebc 的存在。
【解决方案3】:

这是另一种方式,使用du

find . -name "*.php" -type f -print0 | du -c --files0-from=- | awk 'END{print $1}'

【讨论】:

  • 酷,我将 -h 添加到 du 并以 MB 为单位得到了结果,这正是我所需要的。谢谢!
猜你喜欢
  • 2018-04-27
  • 2011-09-25
  • 2012-02-24
  • 1970-01-01
  • 2019-11-03
  • 1970-01-01
  • 2010-12-03
  • 1970-01-01
  • 2010-09-06
相关资源
最近更新 更多