首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Bash find: exec in reverse

Bash find: exec in reverse
EN

Stack Overflow用户
提问于 2022-07-25 09:32:30
回答 5查看 85关注 0票数 1

我正在迭代这样的文件:

代码语言:javascript
复制
find $directory -type f -exec codesign {} \; 

现在的问题是,高层次结构上的文件首先要签名。是否有一种方法可以在目录树上迭代并首先处理最深的文件?

所以

代码语言:javascript
复制
/My/path/to/app/bin

以前处理过

代码语言:javascript
复制
/My/path/mainbin
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2022-07-25 11:07:05

是的,只要使用-depth

-depth

主目录将始终计算为true;它将导致目录层次结构的下降,以便在目录本身之前对目录中的所有条目进行操作。如果未指定-depth主目录,则目录中的所有条目都应在目录本身之后进行操作。如果指定了任何-depth主元,则它将应用于整个表达式,即使-depth主元通常不会被计算。

例如:

代码语言:javascript
复制
$ 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

注意,在特定的级别上,排序仍然是任意的。

票数 6
EN

Stack Overflow用户

发布于 2022-07-25 12:05:07

使用find-depth选项作为我的另一个答案,或者像其他一些简单的排序一样,只会确保目录的子目录在目录本身之前被处理,而不是首先处理最深的级别。

例如:

代码语言:javascript
复制
$ 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

对于要首先处理的总体最深级别,排序应该如下所示:

代码语言:javascript
复制
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函数)来执行这个顺序是:

代码语言:javascript
复制
$ dsort(){
    perl -ne '
        BEGIN { $/ = "\0" } # null-delimited i/o

        $fname[$.] = $_;
        $depth[$.] = tr|/||;

        END {
            print
                map { $fname[$_] }
                sort { $depth[$b] <=> $depth[$a] }
                keys @fname 
        }
    '
}

然后:

代码语言:javascript
复制
$ 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
票数 2
EN

Stack Overflow用户

发布于 2022-07-25 12:14:19

使用GNU实用程序和装饰排序-取消装饰模式(也称为Schwartzian转换):

代码语言:javascript
复制
find . -type f -printf '%d %p\0' |
    sort -znr                    |
    sed -z 's/[0-9]* //'         |
    xargs -0 -I@ echo codesign @

如果输出看起来正常,则删除echo

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73106962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档