【问题标题】:Globbing: Matching files names with a number in a script?通配符:将文件名与脚本中的数字匹配?
【发布时间】:2016-05-27 23:44:04
【问题描述】:

我想匹配目录中的所有文件名,如下所示:

h1.txt, h2.txt, h12.txt, h3.txt

假设目录是test/。我有一个名为 test.sh 的脚本,其中包含以下内容:

p=test/h
echo $p+([[:digit:]]).txt

但这会报错:

./test.sh:第 2 行:意外标记 '(' 附近的语法错误 ./test.sh:

第 2 行:'echo $p+([[:digit:]]).txt'

有人能解释一下这里发生了什么吗?这在控制台中运行良好,请参阅Bash bracket expansion: How to match all files names with a number?

【问题讨论】:

    标签: bash shell glob


    【解决方案1】:

    您只需要启用 extglob 即可使该 glob 表达式起作用:

    shopt -s extglob
    
    p='test/h'
    echo "$p"+([[:digit:]]).txt
    

    输出:

    test/h1.txt test/h12.txt test/h2.txt test/h3.txt
    

    【讨论】:

    • 它在我的 shell 中启用。
    • 哦...它在终端中启用,但不是在脚本中。谢谢,解决了。
    • @becko:另外,请确保您使用 "$p" 的引号,如本答案所示(您没有在问题中使用它们,这是错误的,以防扩展 $p 包含空格或全局字符)。
    • @hek2mgl 如果您想以ary=( test/h+([[:digit:]]) ) 填充数组或以for file in test/h+([[:digit:]]); do ...; done 循环文件,则通配可能会很棒。真的取决于任务。
    • @gniourf_gniourf 当然,它可以很棒。特别是如果您for f in GLOB ...,则不会发生分词这一事实
    【解决方案2】:

    我建议使用find:

    find test -type f -regex '.*h[0-9]+.txt'
    

    原始(过时)答案:

    使用范围可能对您有用:

    echo test/h{1..99}.txt
    

    【讨论】:

    • 这是一种解决方法。但我最初可能不知道值的范围。我只想匹配与文件对应的数字。
    • 如果连范围都不知道,怎么知道文件对应的数字呢?你能告诉我你的基本任务是什么(不是想要的解决方案)吗?
    • 通过查看文件。这就是 bash 扩展本身应该做的事情。就像你只使用* 一样,它会自动扩展到目录中的文件。您不必提前知道那里有哪些文件。
    • find 可能是您选择的工具。
    • 谢谢。这可能是一种更好的方法,但我必须接受另一个答案,因为它回答了我所说的问题。
    猜你喜欢
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 2015-02-17
    • 2017-07-02
    相关资源
    最近更新 更多