Bash find: exec in reverse oder



我正在迭代这样的文件:

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 { $/ = "" } # 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

如何按降序对find的输出进行排序:

while IFS= read -d "" -r f; do
codesign "$f"
done < <(find "$directory" -type f -print0 | sort -zr)
  • <(command ..)是馈送输出的过程替换command通过重定向while循环中的read命令。
  • -print0sort -zread -d ""组合使用空字符 作为文件分隔符。保护包含以下内容的文件名很有用 特殊字符,如空格。

我不知道find中是否有本机方式,但是您可以将它的输出通过管道传输到循环中,并按照自己的方式逐行处理:

find . | while read file; do echo filename: "$file"; done

在您的情况下,如果您很高兴只是反转find的输出,您可以选择如下内容:

find $directory -type f | tac | while read file; do codesign "$file"; done

最新更新