Bash 檔名擴充:避免某些字符

Bash 檔名擴充:避免某些字符

在 Bash 中,我可以Foo1.png透過Foo9.png使用Foo[0-9].png.我可以避免Foo5.png使用Foo[1-46-9].png.有什麼方法可以指定一系列排除十進制數字嗎?

例如,如果我想排除Foo3.pngand Foo7.png,我可以使用Foo[0-24-689],但我會找到一個Foo[^37].png更容易閱讀的模式。這是 Vim 語法,Bash 不會解釋它(不包括3和 )7。但我想知道 Bash 在其檔案名稱擴展中是否有字元排除模式。

如果有匹配的解決方案全部3或之外的單個字符7,在某些情況下也會有幫助(例如引發此問題的特定字符,儘管上面的描述過於簡化)。

答案1

shellbash理解類似正規表示式的Foo[^37].png模式和標準 shell 模式Foo[!37].png,因此您可以毫無問題地使用它們,除非您有其他需要排除的名稱類似Food.png或等的檔案。Fool.png

如果Foo[^37].png在您的腳本中沒有按預期工作,則表示您沒有使用bash,而是使用其他 shell,例如(可能在非 GNU 系統上?)您是否在命令列上dash運行了腳本?sh如果是這樣,請不要這樣做,並#!在腳本中使用正確的 -line 指向正確的 shell 解釋器。

假設您想要排除類似的名稱Food.png,以確保後面跟有Foo數字,然後.png使用Foo[0-9].png。然後排除Foo3.pngFoo7.png其中

for name in Foo[0-9].png; do
    case $name in (*[37].png) continue; esac

    # process "$name" here
done

或者,使用bash語法,

for name in Foo[0-9].png; do
    [[ $name == *[37].png ]] && continue

    # process "$name" here
done

正如 Stéphane Chazelas 在下面的評論中提到的,您可以使用擴展的通配模式來bash測試3和以外的數字7。啟用擴充通配模式shopt -s extglob,然後使用該模式

Foo!(!([0-9])|[37]).png

但對我個人來說,像這個答案的前半部分那樣編寫腳本會更快(或使用Foo[01245689].png在決定我相信這個表達式正在做正確的事情(它做)。

相關內容