我想复制我的目录结构,不包括文件。 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 --null --files-from - --no-recursion
你可以使用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
包含空格或其他特殊字符的目录名称可能需要格外注意。例如:
$ 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
用tar调用tar -T - (要么 --files-from - )将导致它从stdin读取文件名,期望每个文件名由换行符分隔。
为了获得最大效果,可以将其与空终止字符串的选项结合使用:
$ 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
进入你想要开始的文件夹(这就是我们使用find dot的原因) 将tar文件保存在其他地方。我想我错了就把它留在那儿。 焦油与r不是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 |更多来检查你得到了什么。