问题 仅限Tar目录结构


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


1714
2017-08-21 15:09


起源



答案:


你可以使用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

10
2017-08-21 15:15



你需要一辆10秒的车吗? :) - mschr
在早期的GNU焦油显然是你放置的位置 --no递归 论证并不重要,因为它在更新的版本中显然需要优先于它 --files,从 选项...从Debian Wheezy升级到包含GNU tar 1.29的Debian Stretch后,我的备份爆炸了。我相应地编辑了答案。 - Gunter Ohrner


答案:


你可以使用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

10
2017-08-21 15:15



你需要一辆10秒的车吗? :) - mschr
在早期的GNU焦油显然是你放置的位置 --no递归 论证并不重要,因为它在更新的版本中显然需要优先于它 --files,从 选项...从Debian Wheezy升级到包含GNU tar 1.29的Debian Stretch后,我的备份爆炸了。我相应地编辑了答案。 - Gunter Ohrner


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

$ 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


5
2017-10-21 21:53





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

0
2017-08-21 15:14





进入你想要开始的文件夹(这就是我们使用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 |更多来检查你得到了什么。


0
2017-08-02 16:40