Я хочу создать простой 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}*'
Но я не использовал их. В чем проблема?
ls test/*{01,02}*
кажется, ваше указывает на это ...)? Кроме того, в каком формате будут цифры? Если N = 100, вы будете использовать 001 или 1 или ?? начать?cannot access
об ошибкеls
всегда показывает имя, о котором идет речь, в кавычках, что никак не связано с вашей проблемой. Это может зависеть от версииls
, хотя. Попробуйте что-то вродеls foo "foo "
Ответы:
Проблема заключается в том, что оболочка выполнит раскрытие скобки (которое обрабатывает
{...,...}
) перед выполнением подстановки команд ($(...)
деталь). Поэтому после развертыванияseq
оболочка не будет переоценивать{01,02}
и будет оставлять его как литерал.Вам нужно добавить выражение,
eval
чтобы оно переоценивало выражение после выполнения подстановки команды:В этом случае сначала будет выполнена подстановка команды, в результате чего будет получена строка,
ls test/*{01,02}*
иeval
она попросит оболочку интерпретировать ее как команду, которая затем выполнит раскрытие фигурных скобок и глобуса, в результате чего появится список ожидаемых файлов.источник