【问题标题】:Find all *.sh files in directory查找目录中的所有 *.sh 文件
【发布时间】:2013-08-07 13:49:12
【问题描述】:

我想在某个目录中查找所有 *.sh 文件,但是脚本中有一些错误...

#!/bin/sh
for plik in /var/panel/starter/*
do  
    if [ $(basename "$plik") != "priority" ] && [ $(basename "$plik") != "PRIORITY" ] 
    then
    for plik in $plik/*
    do
        filename=$(basename "$plik")
        extension="${filename##*.}"
        filename="${filename%.*}"
        if [ "$extension" == "sh" ]
        then
        echo $plik
        fi
    done
    fi
done 

/var/panel/starter 中有一些文件夹,这些文件夹中有 shell 脚本,这就是我使用 for 循环两次的原因。

这是错误:

[: 19: *: unexpected operator
[: 19: sh: unexpected operator
[: 19: sh: unexpected operator
[: 19: sh: unexpected operator
[: 19: *: unexpected operator

我猜问题出在空文件夹上,例如:

/var/panel/starter/cs16/*

我不知道如何处理。

【问题讨论】:

  • 你可以find -name "*.sh" 吗?如果你想做一些过滤,你可以使用-regex 或将输出传送到grep。或者我误解了你的要求
  • /var/panel/starter/*.sh?
  • 这只是一个例子。稍后我想执行该脚本。不是 echo $plik,而是 sh $plik。如果没有if [ "$extension" == "sh" ] 条件,它也会执行/var/panel/starter/cs16/*,我试图避免这种情况。 @devnull,它不起作用。

标签: shell for-loop directory


【解决方案1】:

sh: unexpected operator 应该会给你一个线索。

您正在使用不支持第 19 行的 == 运算符的 sh 执行脚本。使用 bash 执行脚本应该可以正常工作,或者只使用 =

【讨论】:

    【解决方案2】:

    为什么要使用脚本,什么时候可以使用:

    find path_to_folder -iname "*.sh"
    

    【讨论】:

      【解决方案3】:

      为什么不使用 find 和 grep?

      find /var/panel/starter/ -name "*.sh" | grep -iv "/var/panel/starter/priority"
      

      【讨论】: