Listar arquivos que não começam com um prefixo específico

4

Eu preciso listar apenas os arquivos em um diretório que NÃO começam com qc_dl , qc_dt ou qd_df , mas que também DO terminam em .sas .

Eu posso listar os arquivos que não começam com "qc_dl" como tal:

ls -I "qc_dl*" 

Mas eu não sei como selecionar apenas os programas SAS da lista resultante.

Além disso, posso selecionar todos os arquivos SAS que começam com "qc_dl", "qc_dt" ou "qd_df", da seguinte maneira:

ls qc_d{l,t,f}*.sas

No entanto, não posso combinar os dois comandos para listar apenas os arquivos SAS que NÃO começam com qc_dl/t/f .

    
por Syan 11.12.2014 / 16:36

4 respostas

6

Supondo que os nomes dos arquivos não contenham caracteres de nova linha e não iniciem com . , isso deve funcionar:

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

Listar arquivos terminando em .sas e filtrando tudo que NÃO é qc_dl, qc_dt, qc_df

Para qualquer necessidade de filtragem, o grep é seu amigo.

    
por 11.12.2014 / 16:50
11

Use find em vez disso?

find /my/example/dir -type f -name '*.sas' ! -name 'qc_d[ltf]*'
    
por 11.12.2014 / 16:47
10

Do homem bash:

If the extglob shell option is enabled using the shopt builtin, several extended pattern matching operators are recognized. In the following description, a pattern-list is a list of one or more patterns separated by a |. Composite patterns may be formed using one or more of the following sub-patterns:

         ?(pattern-list)
                 Matches zero or one occurrence of the given patterns
          *(pattern-list)
                 Matches zero or more occurrences of the given patterns
          +(pattern-list)
                 Matches one or more occurrences of the given patterns
          @(pattern-list)
                 Matches one of the given patterns
          !(pattern-list)
                 Matches anything except one of the given patterns

Você pode usar uma correspondência de padrão mais poderosa quando isso estiver ativado.

Para ativá-lo:

~$ shopt -s extglob

Em seguida, você pode listar os arquivos que terminam com .sas e não começam com 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

Para desativá-lo:

~$ shopt -u extglob
    
por 11.12.2014 / 16:44
0
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
    
por 26.10.2018 / 15:08

Tags