Нет встроенного способа сделать это, что я смог найти. Можно всегда генерировать аргументы в цикле как это:
$ printf '[ -d %s ] || mkdir %s; cd %s\n' `for run in {1..3}; do echo "$dir";done`
Небольшое различие:
$ printf '[ -d %s ] || mkdir %s; cd %s\n' $(for run in {1..3}; do echo "$dir";done)
Можно управлять количеством аргументов путем изменения этой части команды {1..3}
.
$ printf '[ -d %s ] || mkdir %s; cd %s\n' $(seq 1 3 | { xargs -i -- echo "$dir"; })
Это создаст seq чисел, 1 - 3, и это управляет сколько раз {xargs-i...} выполнится.
Благодаря комментарию @rici можно также использовать эту конструкцию, yes ... | head -n 3
:
$ printf '[ -d %s ] || mkdir %s; cd %s\n' $(yes "$dir" | head -n 3)
При условии, что имена файлов не содержат Newline символов и не запускаются с .
, это должно работать:
ls -d -- *.sas | grep -v '^qc_d[ltf]'
список файлов, заканчивающихся в .SAS и фильтрацию всего, что не QC_DL, QC_DT, QC_DF
Для любых потребностей фильтрации GREP - ваш друг.
Использование Вместо этого найдите
?
find /my/example/dir -type f -name '*.sas' ! -name 'qc_d[ltf]*'
От Man Bash:
Если опция оболочки ExtGlob включена с помощью Shoptt Shoptin, несколько операторов сопоставления с расширенным шаблоном распознаются. В следующем описании список шаблонов представляет собой список одного или нескольких шаблонов, разделенных |. Составные паттерны могут быть сформированы с использованием одного или нескольких из следующих подпасенсов:
? (Список шаблонов) Соответствует нулю или одному возникновению данных шаблонов * (Список шаблонов) Соответствует нулю или более вхождению данных шаблонов + (Список шаблонов) Соответствует одному или нескольким вхождению данных шаблонов @ (Список шаблонов) Соответствует одному из данных шаблонов ! (Список шаблонов) Совпадает с чем-либо, кроме одного из данных шаблонов
Вы можете использовать более мощное сопоставление шаблонов, когда это включено.
Чтобы включить его:
~$ shopt -s extglob
, затем вы можете перечислить файлы, которые заканчиваются .sas
и не начинаются с QC_D
:
~$ ls
a.sas a.txt b.sas b.txt c.sas c.txt qc_dc.sas qc_df.sas qc_dl.sas qc_dt.sas
~$ ls !(qc_d*).sas
a.sas b.sas c.sas
, чтобы выключить его:
~$ shopt -u extglob
ls -d [![.qc_dl.][.qc_dt.][.qd_df.]]*.sas reference "man 7 glob" [!...] -> any thing but not in that class equivalent to [^...] in grep or regex [.qc_dl.] -> accurate pattern to mach exactly "qc_dl" inside class rather than any character or range occurrence scenario: hey mr shell please list for me all things not starting in "qc_dl" nor "qc_dt" nor "qd_df" but if any of them ending with.sas then its ok you can list them. experiment: $ touch qc_dloooooooo.sas $ touch qc_dloooooooo $ touch qc_dtfffghhjh.sas $ touch qc_dtfffghhjh $ touch cvvvbkkk $ touch cvvvbxcvvcxv $ ls -d [![.qc_dl.][.qc_dt.][.qd_df.]]*.sas qc_dloooooooo.sas qc_dtfffghhjh.sas