Расширение имени файла Bash: избегание определенных символов

Расширение имени файла Bash: избегание определенных символов

В Bash я могу указать имена файлов Foo1.pngс Foo9.pngпомощью Foo[0-9].png. Я могу избежать Foo5.pngиспользования Foo[1-46-9].png. Есть ли способ указать ряд исключений для десятичной цифры?

Например, если бы я хотел исключить Foo3.pngи Foo7.png, я мог бы использовать Foo[0-24-689], но я бы нашел шаблон типа , Foo[^37].pngкоторый был бы намного проще для чтения. Это синтаксис Vim, и Bash не интерпретирует его, исключая 3и 7. Но мне было интересно, есть ли у Bash шаблон для исключения символов в его расширении имени файла.

Если есть решение, которое соответствуетвсеотдельные символы, отличные от 3или 7, которые также были бы полезны в некоторых обстоятельствах (например, в том конкретном случае, который побудил задать этот вопрос, несмотря на чрезмерно упрощенное описание выше).

решение1

Оболочка bashпонимает как шаблон, похожий на регулярное выражение, Foo[^37].pngтак и стандартный шаблон оболочки Foo[!37].png, поэтому вы сможете использовать их без проблем, если у вас нет других файлов с именами типа Food.pngили Fool.pngи т. п., которые необходимо исключить.

Если Foo[^37].pngв вашем скрипте не работает так, как ожидалось, то это означает, что вы используете не bash, а какую-то другую оболочку, например, например dash(возможно, на системе, отличной от GNU?) Вы запускали скрипт shв командной строке? Если так, не делайте этого, а используйте правильную #!-строку в скрипте, указывающую на правильный интерпретатор оболочки.

Предположим, что есть такие имена, Food.pngкоторые вы хотите исключить, чтобы убедиться, что за вами Fooследует цифра, затем .png, затем используйте Foo[0-9].png. Чтобы затем исключить Foo3.pngи Foo7.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

Как упоминает Стефан Шазелас в комментариях ниже, вы можете использовать расширенный шаблон подстановки bashдля проверки цифр, отличных от 3и 7. Включите расширенные шаблоны подстановки с помощью shopt -s extglob, затем используйте шаблон

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

Но лично для меня было бы быстрее написать сценарий, как в первой половине этого ответа (или использовать его, Foo[01245689].pngесли на то пошло), запустить его и сделать это, прежде чем решить, что я считаю, что это выражение делает правильно (оно делает).

Связанный контент