bash получить количество файлов и передать его в цикл for

Я пытаюсь получить количество файлов с определенным шаблоном в каталоге, а затем выполнить цикл for, начиная с нуля до этого числа.

number=`ls -d *pattern_* | wc -l`%3d
for i in {001.."$number"};do
  # do something with $i
done

проблема в том, что мои числа состоят из трех цифр, поэтому я добавил %3d в конец моей переменной number, но это не работает.

поэтому, если у меня есть 20 файлов, переменная number в цикле for должна получить начальный ноль 020.


person jacky    schedule 31.03.2017    source источник
comment
изменить $number на $(seq $number)   -  person P....    schedule 31.03.2017
comment
@PS.: Даже при этом расширение фигурной скобки не может выполнять расширение переменной, оно должно быть отдельным как for i in $(seq $number) , также стоит добавить, что seq не соответствует POSIX.   -  person Inian    schedule 31.03.2017


Ответы (1)


Вы действительно не должны полагаться на вывод ls таким образом, так как вы можете иметь имена файлов со встроенными пробелами, новыми строками и так далее.

К счастью, есть способ сделать это более надежным способом:

((i == 0))
for fspec in *pattern_* ; do
    ((i = i + 1))
    doSomethingWith "$(printf "%03d" $i)"
done

Этот цикл будет выполняться точное количество раз, соответствующее количеству файлов, независимо от странностей указанных файлов. Он также будет использовать правильно отформатированный (трехзначный) аргумент в соответствии с запросом.

person paxdiablo    schedule 31.03.2017
comment
+1... ((i == 0)) тут бесполезно, да? (Если у вас не установлено set -e...) Кроме того, ((i=i+1))`` can be shortened to ((i++))` - person anishsane; 31.03.2017