В 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
если на то пошло), запустить его и сделать это, прежде чем решить, что я считаю, что это выражение делает правильно (оно делает).