查找除某些目录以外的所有可执行文件

2021-02-25 14:33

我正在查找不在我的$PATH中的所有可执行文件。当前我正在执行此操作find/\(-PATHquot;-prune-o-PATHquot;-prune-o-PATHquot;-prune-o-PATHquot;-prune-o-PA

解答动态

  • 假设GNU find和bash shell(如问题中所用),这是一个简短的脚本可以完成你想要做的事情:
    #!/bin/bashIFS=:set-fargs=(-false)表示$PATH中的dirpath;do args+=(-o-PATHquot;)donefind/\(\(quot;\)-o\(-type d\(!-可执行文件-哦!-readable \)\)\)\)-prune-o \-type f-executable-exec file{}+ 首先创建数组参数,由要查找的动态构造的参数组成。它通过在冒号上拆分$PATH的值来实现,这个值是我们给IFS变量的值。当我们在循环头中使用$PATH unquoted时,就会发生拆分。
    通常,shell会在拆分$PATH生成的每个单词上调用filename globbing,但我使用set-f来关闭filename globbing,以防$PATH中的任何目录路径包含globbing字符(由于find的-PATH操作数会将它们解释为模式,因此这些字符仍然是有问题的)。
    如果my PATH变量包含string
    /usr/bin:/bin:/usr/sbin:/sbin:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin 则args将是以下列表(每行数组中有一个单独的元素,这实际上不是一组在它们之间带有换行符的字符串):
    -false-o-path/usr/bin-o-path/bin-o-path/usr/sbin-o-path/sbin-o-path/usr/X11R6/bin-o-path/usr/local/bin-o-path/usr/local/sbin 此列表插入到find命令调用中的括号中。没有必要对每个目录都进行重复修剪,因为您可以像上面一样只使用一次。对于无法访问或列出其内容的目录,这应该可以消除很多权限错误。要通过删除此位来简化find命令吗,请使用
    find/\(quot;\)-prune-o \-type f-executable-exec file{}+ 此外,我正在批处理找到的路径名上运行文件,而不是对每个路径名运行一次,您可以这样做:
    set-o extendedglobLC_ALL=C find/-regextype egrep \-regex${(j[

    • ])${(u)路径:P}//(#m)[.\$^*()+{}\\\\

      • .]/\$MATCH}-prune-o \-type f-executable-exec file{}+$path是一个绑定到$path env var的特殊数组$路径:P获取每个成员${(u)array}的realpath(绝对的,规范的,没有符号链接)删除重复的(这里是规范化后)${array//(#m)pattern/\\$MATCH}在任何与模式匹配的元素(这里是所有的egrep regexp操作符)${(j[

        • ])array}将数组的元素与

          • 连接以获得/dir

            • /dir\.2

              • 。。。正则表达式。

                • End

                免责声明:

                本页内容仅代表作者本人意见,若因此产生任何纠纷由作者本人负责,概与琴岛网公司无关。本页内容仅供参考,请您根据自身实际情况谨慎操作。尤其涉及您或第三方利益等事项,请咨询专业人士处理。