我正在迭代这样的文件:
find $directory -type f -exec codesign {} ;
现在这里的问题是首先对更高层次结构上的文件进行签名。 有没有办法迭代目录树并首先处理最深的文件?
因此
/My/path/to/app/bin
之前处理
/My/path/mainbin
是的,只需使用-depth
:
-深度
主数据库应始终评估为 true;它应导致目录层次结构的下降,以便目录中的所有条目都先于目录本身进行操作。如果未指定 -depth prime,则应在目录本身之后对目录中的所有条目执行操作。如果指定了任何 -depth prim,则即使通常不会计算 -depth primary ,它也应应用于整个表达式。
例如:
$ mkdir -p top/a/b/c/d/e/f/g/h
$ find top -print
top
top/a
top/a/b
top/a/b/c
top/a/b/c/d
top/a/b/c/d/e
top/a/b/c/d/e/f
top/a/b/c/d/e/f/g
top/a/b/c/d/e/f/g/h
$ find top -depth -print
top/a/b/c/d/e/f/g/h
top/a/b/c/d/e/f/g
top/a/b/c/d/e/f
top/a/b/c/d/e
top/a/b/c/d
top/a/b/c
top/a/b
top/a
top
请注意,在特定级别,排序仍然是任意的。
使用 GNU 实用程序和装饰排序非装饰模式(又名 Schwartzian 变换):
find . -type f -printf '%d %p ' |
sort -znr |
sed -z 's/[0-9]* //' |
xargs -0 -I@ echo codesign @
如果输出看起来正常,请删除echo
。
使用find
的-depth
选项作为我的其他答案,或者像其他一些答案一样朴素排序,只能确保目录的子目录在目录本身之前处理,而不是首先处理最深的级别。
例如:
$ mkdir -p top/a/b/d/f/h top/a/c/e/g
$ find top -depth -print
top/a/c/e/g
top/a/c/e
top/a/c
top/a/b/d/f/h
top/a/b/d/f
top/a/b/d
top/a/b
top/a
top
对于首先要处理的整体最深级别,排序应如下所示:
top/a/b/d/f/h
top/a/c/e/g
top/a/b/d/f
top/a/c/e
top/a/b/d
top/a/c
top/a/b
top/a
top
要确定此顺序,必须知道整个列表,然后知道级别数(即。/
)计数以启用排名的每个路径。
一个简单的Perl脚本(在本例中分配给shell函数)来执行此排序是:
$ dsort(){
perl -ne '
BEGIN { $/ = "