Como encontrar todos os arquivos, exceto um arquivo especificado


13

O lspode 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 realmente espero apenas descobrir CentOS-Base.repo, CentOS-Debuginfo.repoe CentOS-Vault.repo, mas não CentOS-Media.repo. Então eu executo este comando

ls [^\(Media\)]

Mas recebo uma informação de erro.



@steeldriver Obrigado pela sua ligação, que é muito útil para mim ..
yode

Você pode considerar mudar o seu shell para zsh , que tem uma remoção padrão de instalação
Basile Starynkevitch

Respostas:


10

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

ls CentOS-[BDV]*

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

ou o mesmo com negação :

ls CentOS-[^M]*

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

ls -I '*M*'

-I, --ignore = PATTERN
não lista entradas implícitas correspondentes ao shell PATTERN

Para ignorar entradas com a Mediapalavra:

ls -I '*Media*'

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


Por que não podemos usar ls *[^M]*
yode

O ls CentOS-[^M]*trabalho, mas a ls *[^M]*não ..
yode

@yode, depende do que exatamente você deseja ignorar: Mocorrência de caracteres OU Mediapalavra?
RomanPerekhrest

Mas no meu caso, apenas esse arquivo tem um caracter M.
yode

3
Os padrões são gananciosos: o primeiro * corresponde a tudo, exceto a última letra, o [^ M] corresponde à última letra, já que nenhum deles termina com M e o * final corresponde à sequência vazia. Então todos eles combinam. E mesmo que algo terminasse com M, ainda assim corresponderia, supondo que houvesse algo diferente de M em algum lugar: por exemplo, se você tivesse um arquivo chamado OOM, a primeira estrela corresponderia ao primeiro O, [^ M] corresponderia ao segundo O eo início de fuga iria coincidir com o M.
NickD

12

Alguns shells possuem operadores de globbing 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 -- *
    

6

Uma opção é usar findcom os -not -name sinalizadores. Ou seja find . -not -name CentOS-Media.repo. Se você não deseja recuar na estrutura de diretórios, adicione -maxdepth 1sinalizador.

Como alternativa, pode-se escrever o seguinte (que é muito mais complexo, mas eu esqueci a -notsinalização e postei esta resposta originalmente, por isso não excluirei esta parte):

find . -print0 | grep --invert-match -z "CentOS-Media.repo$" | tr '\0' '\n'

Você precisa forçar finda separação de nomes de arquivos com byte nulo, para que as novas linhas nos nomes de arquivos não avaliem nada. Felizmente, grepsuporta esse tipo de separador com sinalizador -z. Você pode querer reverter para a separação típica (ou seja, byte nulo -> nova linha) comtr '\0' '\n'


1
Você também pode obter nomes de arquivos separados por nulos com os printf '%s\0' *quais não se repete e não inclui arquivos de ponto por padrão (mas alguns shells têm uma opção para isso). Você também não precisa -Epara que regexp, mas para ser exigente você deve ou barra invertida a .ou colocá-lo em [], e você faz depender GNU encontrar e grep.
dave_thompson_085 23/06

4

A maneira mais fácil é usar o find. Faz:

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

Aqui "f" significa procurar apenas arquivos regulares (embora exclua links simbólicos para arquivos regulares; no GNU find, use -xtype fpara incluí-los). Se você deseja procurar por diretórios, passe "d".

( -maxdepthembora inicialmente uma extensão GNU agora seja bastante comum. Se o seu findnão suportar, você poderá substituí -maxdepth 1-lo pelo padrão ! -name . -prune).

consulte a página do manual find para obter mais recursos impressionantes.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.