раскладывание вложенных скобок и подстановка команд

5

Я хочу создать простой bash-скрипт, который проверяет, содержит ли каталог все файлы, имена которых содержат числа от 1 до N.

# Creating some files for testing
$ cd /tmp/
$ mkdir test
$ touch test/a01x.dat
$ touch test/b02y.dat

# Display dir contents
$ ls test/*{01,02}*
test/a01x.dat  test/b02y.dat

Но использование seqкоманды для генерации чисел приводит к следующему:

$ ls test/*{$(seq -s , -f "%02g" 1 2)}*
ls: cannot access 'test/*{01,02}*': No such file or directory

Я понимаю, что выполнение команды, заключив путь в одинарные кавычки, должно привести к ошибке, так как символы подстановки не расширяются

$ ls 'test/*{01,02}*'

Но я не использовал их. В чем проблема?

ka3ak
источник
«проверить, содержит ли каталог все файлы» - хотите ли вы что-то сделать, если файл не существует с таким номером в нем? Или вы просто хотите показать файлы, которые содержат одно из этих чисел, как часть имени файла ( ls test/*{01,02}*кажется, ваше указывает на это ...)? Кроме того, в каком формате будут цифры? Если N = 100, вы будете использовать 001 или 1 или ?? начать?
Иваниван
@ivanivan Я переименовал вопрос
ka3ak
Сообщение cannot accessоб ошибке lsвсегда показывает имя, о котором идет речь, в кавычках, что никак не связано с вашей проблемой. Это может зависеть от версии ls, хотя. Попробуйте что-то вродеls foo "foo "
ilkkachu

Ответы:

11

Проблема заключается в том, что оболочка выполнит раскрытие скобки (которое обрабатывает {...,...}) перед выполнением подстановки команд ( $(...)деталь). Поэтому после развертывания seqоболочка не будет переоценивать {01,02}и будет оставлять его как литерал.

Вам нужно добавить выражение, evalчтобы оно переоценивало выражение после выполнения подстановки команды:

$ eval "ls test/*{$(seq -s , -f "%02g" 1 2)}*"

В этом случае сначала будет выполнена подстановка команды, в результате чего будет получена строка, ls test/*{01,02}*и evalона попросит оболочку интерпретировать ее как команду, которая затем выполнит раскрытие фигурных скобок и глобуса, в результате чего появится список ожидаемых файлов.

filbranden
источник
1
Благодарю. Я думал об этом, но по неизвестной причине не проверял это.
ka3ak