我的目录结构中有多个名为“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 {} \;
这种方法有几个问题:
- POSIX
find
{}
当出现多次时可能无法按预期工作; - 当出现在较大的字符串中(即不是作为单独的单词)时, POSIX
find
可能无法按预期工作;{}
- 即使您根据需要
find
扩展两者{}
,档案中的路径也将相对于.
。
另一种方法:
find . -name runs -type d -execdir tar -czvf runs.tar.gz runs \;
每个都tar
将在相应的目录中运行。这可能就是您想要的。POSIX 仍不-execdir
要求这样做,您find
可能不支持它;但如果它支持它,那么应该没有问题。
最后runs
可能是{}
,它会根据目录展开,在你的情况下./runs
每次都是。如果你有例如find . -name 'runs*'
那么{}
将是必须的。
POSIX 解决方案(POSIX,当涉及到时find
;tar
本身不是 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##*/}
会非常有用。