【问题标题】:Optimizing a one-line find + exec command优化单行 find + exec 命令
【发布时间】:2013-01-13 17:42:54
【问题描述】:

我需要获取系统上大约 1M+ 个文件的文件信息(名称、大小、修改日期)。 我目前使用的命令是:

sudo find "$FULFILLMENT" "$ARCH1" "$ARCH2" "$MASTERING" -type f -exec ls -lT {} +

有没有办法改善这种情况?唯一的要求是我必须获取上述卷中的所有文件,并为每个文件提取名称、大小和 date_modified。

(有没有办法在这里执行 stat 命令?这会加快速度吗?)

这在光纤连接的机器上大约需要一个小时。

【问题讨论】:

  • 有了+,这将接近最佳状态。您可以将 xargs 配置为一次运行比 find 运行的文件更多的外部机会(以减少对 ls 的整体调用),但这可能是二阶效应。
  • 我听说在管道中使用xargs 比在find 中使用-exec 开关更有效。
  • @David:-exec ... ';' 绝对是这样(它为每个文件单独运行命令),但我怀疑 xargs 比 -exec ... '+' 有很大的改进(它运行许多文件一次)。后者是非标准的,但 OP 已经在使用它,所以显然它在他的系统上可用。与xargs 方法不同,它不会在包含空格的文件名上中断。
  • @ruakh 你把我弄丢了——这是非标准的吗?顺便说一句 - 我相信你知道,空白问题有一个众所周知的解决方案。
  • @David: -exec ... + (many-files-per--exec) 是非标准的。你是对的,有一个空白问题的解决方案,但该解决方案也是非标准的,我认为它没有比-exec ... + 得到更广泛的支持。所以没有太多推荐恕我直言。

标签: linux performance shell unix find


【解决方案1】:

您可以使用find的内置打印,而不是将打印输出到ls:

sudo find ... -type f -printf '%p      %s      %t\n'

我不确定这会快多少,但它可以将分叉保存到ls,并且无需再次查询磁盘以通过ls 检索信息,find 已经无论如何,它应该至少有点快。

(顺便说一句,您可以在man find 中搜索-printf 以获取有关这些格式字符串的更多信息。特别是,您可以自定义最后修改时间的表示,并且可以指定明确的字段宽度其他字段。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 2015-02-17
    • 2015-03-06
    相关资源
    最近更新 更多