所以我编写了一个bash脚本,它计算一个目录中的文件数并输出一个数字。函数接受一个目录参数和一个可选的文件类型扩展参数。
我使用以下行将dir变量设置为目录,将ext变量设置为正则表达式,该表达式将表示要计数的所有文件类型。

dir=$1
[[ $# -eq 2 ]] && ext="*.$2" || ext="*"

我遇到的问题发生在尝试运行以下行时:
echo $(find $dir -maxdepth 1 -type f -name $ext | wc -l)

当我提供第二个文件类型参数时,从终端运行脚本会起作用,但如果不提供,则会失败。
harrison@Luminous:~$ bash Documents/howmany.sh Documents/ sh
3
harrison@Luminous:~$ bash Documents/howmany.sh Documents/
find: paths must precede expression: Desktop
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
0

我已经搜索了这个错误,我知道这是shell扩展通配符的问题,如here所述。我试过使用单引号、双引号和反斜杠来转义星号,但似乎没有效果。特别有趣的是,当我尝试直接通过终端运行时,它工作得非常好。
harrison@Luminous:~$ echo $(find Documents/ -maxdepth 1 -type f -name "*" | wc -l)
6

最佳答案

简化:

dir=${1:-.}           #if $1 not set use .
name=${2+*.$2}        #if $2 is set use *.$2 for name
name=${name:-*}       #if name still isnt set, use *

find "$dir" -name "$name" -print   #use quotes


name=${2+*.$2}        #if $2 is set use *.$2 for name
find "${1:-.}" -name "${name:-*}" -print   #use quotes

而且,正如@john kugelman所说,你可以使用:
 name=${2+*.$2}
 find "${1:-.}" ${name:+-name "$name"} -print

find . -name "*" -printfind . -print相同,因此如果未设置$name,则无需指定-name "*"

关于regex - 在终端中找到作品但在bash脚本中失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25984005/

10-16 11:08
查看更多