per*_*eal 12
你可以使用find获取目录,然后tar它们:
find .. -type d -print0 | xargs -0 tar cf dirstructure.tar --no-recursion
Run Code Online (Sandbox Code Playgroud)
如果您有超过10000个目录,请使用以下方法解决xargs限制:
find . -type d -print0 | tar cf dirstructure.tar --no-recursion --null --files-from -
Run Code Online (Sandbox Code Playgroud)
包含空格或其他特殊字符的目录名称可能需要格外注意.例如:
$ 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
Run Code Online (Sandbox Code Playgroud)
以下是处理这些"异常"目录名称的一些变体:
$ find backup/ -type d -print0 | xargs -0 tar cf directory-structure.tar --no-recursion
Run Code Online (Sandbox Code Playgroud)
将-print0与find一起使用会将文件名作为以空字符结尾的字符串发出; 使用-0 xargs将以相同的方式解释参数.使用null作为终止符有助于确保即使正确解释带有空格和换行符的文件名也是如此.
也可以将结果直接find
传递给tar
:
$ find backup/ -type d | tar cf directory-structure.tar -T - --no-recursion
Run Code Online (Sandbox Code Playgroud)
使用-T -(或--files-from -)调用tar 将导致它从stdin读取文件名,期望每个文件名由换行符分隔.
为了获得最大效果,可以将其与以null结尾的字符串选项结合使用:
$ find . -type d -print0 | tar cf directory-structure.tar --null --files-from - --no-recursion
Run Code Online (Sandbox Code Playgroud)
其中我认为最后一个版本是最强大的,因为它支持不寻常的文件名和(与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
Run Code Online (Sandbox Code Playgroud)