从info cpio
页面:
如果您想归档整个目录树,find 命令可以向 cpio 提供文件列表:
% find . -print -depth | cpio -ov > tree.cpio
“-深度”选项强制“查找”在打印目录本身之前打印目录中的条目。这通过在目录名称本身之前打印目录中的目录条目来限制限制性目录权限的影响。
最后一部分是什么意思?在目录名称本身之前打印目录中的目录条目如何限制限制性目录权限的影响?
答案1
大多数cpio
实现都是愚蠢的,并且在解压档案时不管理目录权限。
如果目录没有写访问权限,并且 cpio 存档按照通常的顺序find
,则该目录将位于cpio
存档中的第一个位置,并且首先从cpio
存档中解压缩。当这样的“只读”目录被解压并赋予其权限时,当稍后在存档中看到目录内容并将被解压时,它没有权限将文件放入其中。
解决此
cpio
问题的一种解决方案是创建存档,其中目录的内容在前,相关目录在内容之后。这会导致使用默认权限cpio
创建丢失的目录(如果调用-d
创建丢失的目录),从存档中提取其中的文件,然后,当在存档中看到该目录时,将权限设置为“只读”。cpio
另一个解决方案是使用愚蠢的实现来提取存档root
,因为root
即使在只读目录中也允许创建文件。第三种解决方案是使用现代
cpio
实现,例如cpio
内部的仿真star
。star
记住存档中的目录权限,但首先创建具有中间写入权限的目录。star
将存档中的文件提取到具有中间写入权限的目录后,会延迟设置记住的真实目录权限。
答案2
OSX(以及 BSD)版本的find
手册页说明如下:
-d Cause find to perform a depth-first traversal, i.e., directories
are visited in post-order and all entries in a directory will
be acted on before the directory itself. By default, find visits
directories in pre-order, i.e., before their contents. Note,
the default is not a breadth-first traversal.
This option is equivalent to the -depth primary of IEEE Std
1003.1-2001 (``POSIX.1''). The -d option can be useful when find
is used with cpio(1) to process files that are contained in
directories with unusual permissions. It ensures that you have
write permission while you are placing files in a directory,
then sets the directory's permissions as the last thing.
最后一句解释了为什么,更好一点???
切换的目的-depth
是强制find
深入到它找到的每个目录,直到到达“叶节点”,然后将其打印出来。
笔记:强制-depth
子目录在其父目录之前被处理。
通过使用该-depth
开关,您可以保证find
在将父目录转发到可能过于严格的命令时不会被绊倒cpio
,并且由于您的用户 ID 不允许完全读取/执行而不允许创建较低级别的目录特权。
- -深度选项(实际上是一个始终为真的标准)强制输出为深度优先- 也就是说,首先是文件,然后是包含它们的目录。当目录具有限制性权限时,这会有所帮助,并且首先恢复目录可能会阻止文件恢复(并且在任何情况下都会更改目录上的时间戳)。通常,find 首先返回目录,然后再返回该目录中的任何文件。