Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 仅对目录结构进行Tar_Unix_Tar - Fatal编程技术网

Unix 仅对目录结构进行Tar

Unix 仅对目录结构进行Tar,unix,tar,Unix,Tar,我想复制我的目录结构,不包括文件。tar中是否有忽略所有文件并仅递归复制目录的选项。您可以使用find获取目录,然后对其进行tar: 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 find .. -type d -print0 | xar

我想复制我的目录结构,不包括文件。tar中是否有忽略所有文件并仅递归复制目录的选项。

您可以使用find获取目录,然后对其进行tar:

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
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 -

进入要开始的文件夹(这就是为什么我们使用find dot) 将tar文件保存到其他地方。我想我把它放在那里是个错误。 加r而不是c的焦油。我认为有了cf,你会不断创建新文件,而你只需要 获取最后一组文件子目录。tarr附加到tar文件。 --没有递归,因为find已经为您提供了整个文件列表 所以你不想重现

找到-键入d| xargs tar rf/somewhere/whatever-dirsonly.tar——无递归


tar tvf/somewhere/where-dirsonly.tar |更多信息以检查您得到了什么。

包含空格或其他特殊字符的目录名可能需要额外注意。例如:

$ 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一起使用会将文件名作为以null结尾的字符串发出;对于-0,xargs将以相同的方式解释参数。使用null作为终止符有助于确保即使是带有空格和换行符的文件名也能正确解释

还可以将结果直接从
find
导入
tar

$ find backup/ -type d | tar cf directory-structure.tar -T - --no-recursion
使用-T-(或--files from-)调用tar将导致它从stdin中读取文件名,希望每个文件名之间用换行符分隔

为获得最大效果,可将此选项与以null结尾的字符串的选项结合使用:

$ find . -type d -print0 | tar cf directory-structure.tar --null --files-from - --no-recursion

这些,我认为这个最后版本是最健壮的,因为它支持非同寻常的文件名,并且(不像XARGS)不受系统命令行大小的固有限制。(请参见

xargs--show limits

对于AIX:

tar cvfD some-tarball.tar `find /dir_to_start_from -type d -print` 

在早期的GNU TAR中,您放置--no recursion参数的位置显然对它的工作没有影响,而在更当前的版本中,它显然需要处理--files from选项。。。我的备份在从Debian Wheezy升级到Debian Stretch(包括GNU tar 1.29)后爆炸式增长。我相应地编辑了答案。我编辑了答案并将
--无递归
移到
--文件之前。