我正在迭代这样的文件:
find $directory -type f -exec codesign {} \; 现在的问题是,高层次结构上的文件首先要签名。是否有一种方法可以在目录树上迭代并首先处理最深的文件?
所以
/My/path/to/app/bin以前处理过
/My/path/mainbin发布于 2022-07-25 11:07:05
是的,只要使用-depth
-depth
主目录将始终计算为true;它将导致目录层次结构的下降,以便在目录本身之前对目录中的所有条目进行操作。如果未指定-depth主目录,则目录中的所有条目都应在目录本身之后进行操作。如果指定了任何-depth主元,则它将应用于整个表达式,即使-depth主元通常不会被计算。
例如:
$ 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注意,在特定的级别上,排序仍然是任意的。
发布于 2022-07-25 12:05:07
使用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要确定这个顺序,必须知道整个列表,然后是级别数(即。( /)对每条路径进行计数以启用排序。
一个简单的ish Perl脚本(在本例中分配给一个shell函数)来执行这个顺序是:
$ dsort(){
perl -ne '
BEGIN { $/ = "\0" } # null-delimited i/o
$fname[$.] = $_;
$depth[$.] = tr|/||;
END {
print
map { $fname[$_] }
sort { $depth[$b] <=> $depth[$a] }
keys @fname
}
'
}然后:
$ find top -print0 | dsort | xargs -0 -I@ echo @
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发布于 2022-07-25 12:14:19
使用GNU实用程序和装饰排序-取消装饰模式(也称为Schwartzian转换):
find . -type f -printf '%d %p\0' |
sort -znr |
sed -z 's/[0-9]* //' |
xargs -0 -I@ echo codesign @如果输出看起来正常,则删除echo。
https://stackoverflow.com/questions/73106962
复制相似问题