Como encontrar todos os arquivos, exceto um arquivo especificado

12

O ls pode dar um resultado como

[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# ls

CentOS-Base.repo CentOS-Debuginfo.repo CentOS-Media.repo CentOS-Vault.repo

Mas, na verdade, espero descobrir apenas CentOS-Base.repoCentOS-Debuginfo.repo e CentOS-Vault.repo , mas não CentOS-Media.repo . Então eu corro este comando

ls [^\(Media\)]

Mas recebo uma informação de erro. Como devo proceder?

    
por yode 23.06.2017 / 13:47

4 respostas

10

No caso mais simples, você pode usar o seguinte (no caso, se a primeira sub-palavra for estática CentOS ):

ls CentOS-[BDV]*
  • [BDV] - classe de caractere para garantir a segunda subword começando com um dos caracteres especificados

ou o mesmo com negação :

ls CentOS-[^M]*

Se você quiser ignorar todos os nomes de arquivos que contêm o caractere M , com a implementação GNU de ls (como normalmente encontrado no CentOS), use a opção -I ( --ignore ):

ls -I '*M*'

-I, --ignore=PATTERN
do not list implied entries matching shell PATTERN

Para ignorar entradas com Media word:

ls -I '*Media*'

Esses padrões precisam ser passados textualmente para ls , portanto, devem ser citados (caso contrário, o shell os trataria como globs para expandir).

    
por 23.06.2017 / 13:50
12

Alguns shells têm operadores de globalização de negação:

  • zsh -o extendedglob :

    ls -d -- ^*Media*
    ls -d -- *.repo~*Media* # ~ is "except" operator
    
  • ksh , zsh -o kshglob , bash -O extglob :

    ls -d -- !(*Media*)
    
  • bash :

    GLOBIGNORE='*Media*'
    ls -d -- *
    
  • ksh :

    FIGNORE='@(*Media|.)*'
    ls -d -- *
    
por 23.06.2017 / 13:59
6

Uma opção é usar find com os -not -name flags. Ou seja %código%. Se você não quiser recursar na estrutura de diretórios, adicione find . -not -name CentOS-Media.repo flag.

Como alternativa, pode-se escrever o seguinte (que é muito mais complexo, mas eu esqueci o -maxdepth 1 flag e postei essa resposta originalmente, então não vou deletar essa parte):

-not

Você precisa forçar find . -print0 | grep --invert-match -z "CentOS-Media.repo$" | tr 'find' '\n' a separar os nomes de arquivos com o byte nulo, para que as novas linhas nos nomes dos arquivos não quebrem nada. Espera-se que grep suporte este tipo de separador com o sinalizador -z . Você pode querer reverter para a separação típica (ou seja, byte nulo - > nova linha) com tr '%code%' '\n'

    
por 23.06.2017 / 14:03
4

A maneira mais fácil é usar o find. Faça:

find . -maxdepth 1 -type f ! -name "CentOS-Media.repo"

Aqui "f" significa procurar por arquivos regulares apenas (exclui links simbólicos para arquivos regulares; com o GNU find , use -xtype f para incluí-los). Se você quiser procurar por diretórios, passe "d".

( -maxdepth , embora inicialmente uma extensão GNU seja bastante comum. Se o seu find não for compatível, você poderá substituir -maxdepth 1 pelo padrão ! -name . -prune ).

veja a página de manual do mantenedor para obter recursos mais impressionantes.

    
por 27.06.2017 / 22:38

Tags