*.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 %
它处理文件名中的几乎所有特殊字符。