【发布时间】:2012-08-21 15:09:15
【问题描述】:
我想复制不包括文件的目录结构。 tar 中是否有任何选项可以忽略所有文件并仅递归复制目录。
【问题讨论】:
我想复制不包括文件的目录结构。 tar 中是否有任何选项可以忽略所有文件并仅递归复制目录。
【问题讨论】:
您可以使用 find 获取目录,然后将它们 tar:
find .. -type d -print0 | xargs -0 tar cf dirstructure.tar --no-recursion
如果您有超过 10000 个目录,请使用以下解决 xargs 限制:
find . -type d -print0 | tar cf dirstructure.tar --no-recursion --null --files-from -
【讨论】:
--no-recursion移到--files-from之前。
包含空格或其他特殊字符的目录名称可能需要特别注意。例如:
$ mkdir -p "backup/My Documents/stuff"
$ find backup/ -type d | xargs tar cf directory-structure.tar --no-recursion
tar: backup/My: Cannot stat: No such file or directory
tar: Documents: Cannot stat: No such file or directory
tar: backup/My: Cannot stat: No such file or directory
tar: Documents/stuff: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors
以下是处理这些“不寻常”目录名称的一些变体:
$ find backup/ -type d -print0 | xargs -0 tar cf directory-structure.tar --no-recursion
将 -print0 与 find 一起使用会将文件名作为以空字符结尾的字符串发出;使用 -0 xargs 将以相同的方式解释参数。使用 null 作为终止符有助于确保即使是带有空格和换行符的文件名也能被正确解释。
也可以将结果直接从find 传送到tar:
$ find backup/ -type d | tar cf directory-structure.tar -T - --no-recursion
使用 -T -(或 --files-from -)调用 tar 将导致它从标准输入读取文件名,期望每个文件名由一行分隔休息。
为了获得最大效果,这可以与空终止字符串的选项结合使用:
$ find . -type d -print0 | tar cf directory-structure.tar --null --files-from - --no-recursion
我认为最后一个版本是最强大的,因为它支持不常见的文件名,并且(与 xargs 不同)本身不受系统命令行大小的限制。 (见xargs --show-limits)
【讨论】:
for i in `find . -type d`; do mkdir -p /tmp/tar_root/`echo $i|sed 's/\.\///'`; done
pushd /tmp/tar_root
tar cf tarfile.tar *
popd
# rm -fr /tmp/tar_root
【讨论】:
进入您要开始的文件夹(这就是我们使用查找点的原因) 将tar文件保存在其他地方。我想我把它放在那里有一个错误。 带有 r 的 tar 不是 c。我认为使用 cf 您会不断创建新文件,而您只会 获取最后一组文件子目录。 tar r 附加到 tar 文件。 --no-recursion 因为 find 已经为您提供了整个文件列表 所以你不想递归。
找到 . -type d |xargs tar rf /somewhereelse/whatever-dirsonly.tar --no-recursion
tar tvf /somewhereelse/whatever-dirsonly.tar |more 来检查你得到了什么。
【讨论】:
对于 AIX:
tar cvfD some-tarball.tar `find /dir_to_start_from -type d -print`
【讨论】: