计算Unix命令可以执行多少个文件

时间:2016-05-28 07:23:16

标签: linux shell unix

所以我在$ dir中给了一个目录,在$ 1中给了一个Unix命令我需要检查$ dir目录中有多少个文件可以执行$ 1 Unix命令。

for dir in `echo $PATH|tr : '\n'`
do
  for file in `find $dir -type f`
  do
    #Here I would like to check if the command works on the file
    then
        echo " $1 $dir/$file works"
    else
        echo " $1 $dir/$file doesn't work"
    fi
  done 
done

1 个答案:

答案 0 :(得分:1)

您似乎想要搜索PATH中的所有文件,并且对于每个文件,查看命令$1是否成功或以该文件作为参数失败。在那种情况下:

#!/bin/bash
(IFS=:
find $PATH -type f -exec bash -c 'if "$1" "$2"; then echo "$1 $2 works"; else echo "$1 $2 fails"; fi' None "$1" {} \;
)

或者,为了提高效率:

(IFS=:
find $PATH -type f -exec bash -c 'cmd=$1; shift; for f in "$@"; do if "$cmd" "$f"; then echo "$cmd $f works"; else echo "$cmd $f fails"; fi; done' None "$1" {} +
)

如何运作

  • (

    这会启动一个子shell。这样做是为了使IFS在子shell完成后返回其原始值。

  • IFS=:

    这告诉shell在:上进行单词拆分。

  • find $PATH -type f -exec bash -c '...' None "$1" {} +

    这将查找PATH目录下的所有常规文件,并在'...'上执行命令。

    更具体地说,'...'中的命令是作为位置参数给出的,命令$1的名称以及一个或多个(可能很多)文件作为参数进行测试。

  • '...'中的命令是:

    cmd=$1
    shift
    for f in "$@"; do
        if "$cmd" "$f"
        then echo "$cmd $f works"
        else echo "$cmd $f fails"
        fi
    done
    

    这些命令测试命令是否成功并报告结果。

  • )

    这将关闭子shell

使命令

的输出变得沉寂

正如格伦杰克曼建议的那样,您可能不希望看到命令$1的每次运行的输出,而只是跟踪它是成功还是失败。在这种情况下,我们可以将命令的输出重定向到/dev/null,如下所示:

#!/bin/bash
(IFS=:;  find $PATH -type f -exec bash -c 'if "$1" "$2" >/dev/null 2>&1; then echo "$1 $2 works"; else echo "$1 $2 fails"; fi' None "$1" {} \; )

完成后,输出可能如下所示:

$ bash scriptname ls
ls /bin/keyctl works
ls /bin/mt-gnu works
ls /bin/uncompress works
ls /bin/nano works
ls /bin/zless works
ls /bin/run-parts works
[...snip...]