gpt4 book ai didi

regex - find 在终端中有效,但在 bash 脚本中失败

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:58:08 25 4
gpt4 key购买 nike

所以我正在编写一个 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

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

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

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