如何在单个命令中创建特定类型的每个文件的 tar.gz?

如何在单个命令中创建特定类型的每个文件的 tar.gz?

*.html我需要在各自的位置压缩和解压缩特定类型的每个文件。对于解压,我使用了以下命令,它似乎对我有用:

find dir -name "*.html.tar.gz" -exec tar -xvzf {} \;

我可以*.htmp.tar.gz在各自的目录中看到。

对于压缩,我正在尝试执行以下命令,但它不起作用,因为 find 的参数没有发生串联:

find dir -name "*.html" -exec tar -cvzf {}.tar.gz {} \;

请提出解决方案,并让我知道减压解决方案是否万无一失。

编辑:虽然我现在使用的gunzip不需要目标名称,但我想知道是否tar根本不可能。因此,等待解决原始问题的答案。

编辑:要求是有一个命令,因为我需要通过C 函数运行它fork()和命令。exec()所以,我认为管道是不可能的。

编辑:我也在寻找有效的方法,因为我希望压缩所需的时间尽可能少。

答案1

find . -name '*.html' -type f -exec sh -c '
   for file do tar czf "$file.tar.gz" "$file"; done' sh {} +

在C中:

execlp("find", "find", ".", "-name", "*.html", "-type", "f", "-exec",
       "sh", "-c", "for file do tar czf \"$file.tar.gz\" \"$file\"; done",
       "sh", "{}", "+", 0);

要向调用者报告失败或任何归档过程,您可以将其改进为:

find . -name '*.html' -type f -exec sh -c '
  ok=true
  for file do
    tar czf "$file.tar.gz" "$file" || ok=false
  done
  "$ok"' sh {} +

对于-exec cmd {} +find如果它生成的执行命令的任何进程以非零退出状态返回,则以非零退出状态退出。

答案2

您必须使用以下方法xargs来实现此目的:

find "dir" -name "*.html" -print0 | xargs -0 -n1 -I % tar zcpf %.tar.gz %

它处理文件名中的几乎所有特殊字符。

相关内容