使用 find -exec 时如何加入两个命令的输出?

How to join the output of two commands when using find -exec?

我有以下代码:

find . -exec stat --format='%n,%x,%y,%z,' \; 2>&1 | tee output_sasdata_file_info.txt

我希望 du -k 命令在 %z,

之后立即执行并保存到 txt

尝试这样做,但它只是 运行 du -k 命令并忽略了 stat

find . -exec stat --format='%n,%x,%y,%z' find . -exec du -k,; \; 2>&1 | tee output_sasdata_file_info.txt

所需输出示例:

./sas/anual.sas7bdat.gz,2020-03-04 11:21:59.648155603 -0300,2020-03-04 11:21:59.845155836 -0300,2021-02-01 16:40:26.542568391 -0350,2656546

这个版本适用于我的电脑:

find . -exec stat --printf='%n,%x,%y,%z,' {} \; -exec du -k {} \; 2>&1 | tee output_sasdata_file_info.txt

使用 stat--printf 选项打印没有尾随换行符的行。

如果你想 运行 两个命令的输出合并成一行,你需要使用 -exec 来执行一个 shell 运行 两个命令。

find . -exec sh -c \
  'for f; do stat --format="%n,%x,%y,%z,$(du -k "$f")" "$f"; done' \
  _ {} +

一些解释说明:

  1. 当使用-c时,shell命令后的第一个参数用于设置[=13=]。当我不关心 [=13=] 设置为什么时,我通常使用虚拟值 _
  2. -exec ... {} + 会将尽可能多的匹配传递给 运行.
  3. 命令
  4. -c 参数中的循环遍历在此调用中由 find 传递给 shell 的文件。
  5. du -k "$f"是运行首先构造调用stat ... "$f"时要使用的格式字符串。 (我假设 du 的参数将是单个文件,而不是目录,否则您将获得一个结果列表,这些结果将无法很好地适合您要构建的行。)