Файлы списка, которые не начинаются с определенного префикса

Нет встроенного способа сделать это, что я смог найти. Можно всегда генерировать аргументы в цикле как это:

для цикла

$ 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}.

seq и xargs

$ 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)

Ссылки

4
12.12.2014, 01:40
4 ответа

При условии, что имена файлов не содержат Newline символов и не запускаются с . , это должно работать:

ls -d -- *.sas | grep -v '^qc_d[ltf]'

список файлов, заканчивающихся в .SAS и фильтрацию всего, что не QC_DL, QC_DT, QC_DF

Для любых потребностей фильтрации GREP - ваш друг.

6
27.01.2020, 20:44

Использование Вместо этого найдите ?

find /my/example/dir -type f -name '*.sas' ! -name 'qc_d[ltf]*'
11
27.01.2020, 20:44

От 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
10
27.01.2020, 20:44
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
0
27.01.2020, 20:44

Теги

Похожие вопросы