为什么我们将“find -depth”与“cpio”一起使用

为什么我们将“find -depth”与“cpio”一起使用

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内部的仿真starstar记住存档中的目录权限,但首先创建具有中间写入权限的目录。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 首先返回目录,然后再返回该目录中的任何文件。

参考

相关内容