tar.gz 文件夹并使用文件夹名称作为档案名称

tar.gz 文件夹并使用文件夹名称作为档案名称

我的目录结构中有多个名为“runs”的文件夹,我想为它们创建单独的存档,因为它们包含难以管理的文件数量”。因此,我想使用 find 来查找具有该名称的文件,我已经成功做到了。但是,找到它们后,我想创建包含这些文件夹的存档,并且存档的位置必须与文件夹相同。我尝试了以下方法:

find . -name runs -type d -exec tar -czvf {} runs.tar.gz \;

但无济于事。请帮忙。

答案1

runs.tar.gz-f应该是选项之后的选项参数tar,因此您需要重新排序(但不要运行此操作):

find . -name runs -type d -exec tar -czvf runs.tar.gz {} \;

这将runs.tar.gz在当前工作目录中创建,您显然不希望这样。此外,存档将包含相对于的路径,.因为{}扩展到相对于我们刚刚提供的路径的路径find


由于目录名称(runs)是档案名称(runs.tar.gz)的子字符串,您可以尝试以下操作:

find . -name runs -type d -exec tar -czvf {}.tar.gz {} \;

这种方法有几个问题:

  • POSIXfind{}当出现多次时可能无法按预期工作;
  • 当出现在较大的字符串中(即不是作为单独的单词)时, POSIXfind可能无法按预期工作;{}
  • 即使您根据需要find扩展两者{},档案中的路径也将相对于.

另一种方法:

find . -name runs -type d -execdir tar -czvf runs.tar.gz runs \;

每个都tar将在相应的目录中运行。这可能就是您想要的。POSIX 仍不-execdir要求这样做,您find可能不支持它;但如果它支持它,那么应该没有问题。

最后runs可能是{},它会根据目录展开,在你的情况下./runs每次都是。如果你有例如find . -name 'runs*'那么{}将是必须的。


POSIX 解决方案(POSIX,当涉及到时findtar本身不是 POSIX 所要求的;pax是 POSIX 归档器):

find . -name runs -type d -exec sh -c '
  cd "${1%/*}" && tar -czvf runs.tar.gz runs
' find-sh {} \;

笔记:

  • 而可以"${1%/*}""$(dirname "$1")"。由于find需要提供不带尾部斜杠的路径,因此前一种仅操作字符串的语法应该可以并且更快。
  • 一般情况下可能是tar -czvf "${1##*/}.tar.gz" "${1##*/}"。在你的情况下${1##*/}总是会扩展为,runs但如果你有例如find . -name 'runs*'那么${1##*/}会非常有用。

相关内容