我想复制不包括文件的目录结构。tar 中是否有任何选项可以忽略所有文件并仅递归复制目录。
5 回答
您可以使用 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 -
包含空格或其他特殊字符的目录名称可能需要额外注意。例如:
$ 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
)
进入您要开始的文件夹(这就是我们使用 find dot 的原因)将 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 来检查你得到了什么。
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
对于 AIX:
tar cvfD some-tarball.tar `find /dir_to_start_from -type d -print`