gpt4 book ai didi

linux - 统计一条Unix命令可以执行多少个文件

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:45:41 26 4
gpt4 key购买 nike

所以我在 $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

最佳答案

您似乎想要搜索 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 在 : 上进行分词。

  • 找到 $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

静音命令的输出

正如 glenn jackman 所建议的,您可能不想看到每次运行命令 $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...]

关于linux - 统计一条Unix命令可以执行多少个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37496362/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com