我想复制不包含文件的目录结构。 tar中是否有任何选项可以忽略所有文件并以递归方式仅复制目录。
答案 0 :(得分:11)
您可以使用find来获取目录然后tar它们:
find .. -type d -print0 | xargs -0 tar cf dirstructure.tar --no-recursion
如果您有超过10000个目录,请使用以下方法解决xargs限制:
find . -type d -print0 | tar cf dirstructure.tar --null --files-from - --no-recursion
答案 1 :(得分:5)
包含空格或其他特殊字符的目录名称可能需要格外注意。例如:
$ 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将导致它从stdin读取文件名,期望每个文件名由一行分隔断裂。
为了获得最大效果,可以将其与空终止字符串的选项结合使用:
$ find . -type d -print0 | tar cf directory-structure.tar --null --files-from - --no-recursion
其中我认为最后一个版本是最强大的,因为它支持不寻常的文件名和(与xargs不同)本身并不受系统命令行大小的限制。 (见xargs --show-limits
)
答案 2 :(得分:0)
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
答案 3 :(得分:0)
进入你想要开始的文件夹(这就是我们使用find dot的原因) 将tar文件保存在其他地方。我想我错了就把它留在那儿。 焦油与r不是c。我认为使用cf你不断创建新文件 获取最后一组文件子目录。 tar r附加到tar文件。 --no-recursion因为find已经为你提供了你的整个文件列表 所以你不想递归。
找到。 -type d | xargs tar rf /somewhereelse/whatever-dirsonly.tar --no-recursiontar tvf /somewhereelse/whatever-dirsonly.tar |更多来检查你得到了什么。
答案 4 :(得分:0)
对于AIX:
tar cvfD some-tarball.tar `find /dir_to_start_from -type d -print`