Listar arquivos que não correspondem a uma determinada string no nome do arquivo

13

Eu tenho um diretório no qual muitos arquivos (cerca de 200) com o nome temp_log.$$ são criados com vários outros arquivos importantes que preciso verificar.

Como posso listar facilmente todos os arquivos e excluir os arquivos temp_log.$$ da exibição?

Saída esperada

$ ls -lrt <exclude-filename-part>
-- Lists files not matching the above given string

Eu passei pela página ls man, mas não encontrei nada nessa referência. Por favor, deixe-me saber se eu perdi alguma informação vital aqui.

Obrigado

    
por mtk 16.10.2012 / 14:14

6 respostas

22

Com o GNU ls (a versão no Linux não integrado e no Cygwin, às vezes também encontrado em outro lugar), você pode excluir alguns arquivos ao listar um diretório.

ls -I 'temp_log.*' -lrt

(observe a forma longa de -I is --ignore='temp_log.*' )

Com o zsh, você pode deixar o shell fazer a filtragem. Passe -d para ls para evitar listar o conteúdo dos diretórios correspondentes.

setopt extended_glob          # put this in your .zshrc
ls -dltr ^temp_log.*

Com ksh, bash ou zsh, você pode usar a sintaxe de filtragem do ksh. Em zsh, execute setopt ksh_glob primeiro. No bash, execute shopt -s extglob primeiro.

ls -dltr !(temp_log.*)
    
por 16.10.2012 / 15:07
9

Você pode usar grep com a opção -v .

ls -lrt | grep -v <exclude-filename-part>
    
por 16.10.2012 / 14:17
2

Você pode usar find para isso:

find . \! -name 'temp_log*'

Isso imprimirá os nomes, você poderá adicionar -ls para obter uma saída de ls -l style com timestamp e permissões ou usar -exec ls {} + para passar para ls com as opções que desejar para colunas, classificação, etc. .

Eu escrevi isso assumindo que eram apenas arquivos em um diretório. Se o diretório contiver outros diretórios, você pode querer evitar listá-los recursivamente

find . \! -name 'temp_log*' -maxdepth 1

E se você usar o ls você vai querer passar a opção -d para parar ele da listagem dentro dos diretórios: -exec ls -d {} +

    
por 16.10.2012 / 14:39
2

Eu acho que você quer usar um recurso do shell, não de ls . Eu uso bash, então eu verifiquei o que você quer em man bash . Procure por "^ EXPANSION" (pressionando primeiro '/'). Trecho:

EXPANSION

    Expansion is performed on the command line after it has been split into words.  There are seven kinds of expansion performed: brace expansion, tilde expansion, parameter and variable expansion, command substitution, arithmetic expansion, word splitting, and pathname expansion.

   ︙
... < snip > ...
   ︙

Pathname Expansion

    After word splitting, unless the -f option has been set, bash scans each word for the characters *, ?, and [.  If one of these characters appears, then the word is regarded as a pattern, and replaced with an alphabetically sorted list of file names matching the pattern.  …

Recentemente, comecei a excluir arquivos com base em sua primeira carta, com um comando como:

$ ls ./[^t]*

Isso corresponderia a qualquer coisa que não comece com a letra t . Se você adicionar mais caracteres entre os colchetes, exclua os arquivos que começam com essas letras também.

Procurando por um link, e eu tenho um bom! Consulte Correspondência de padrões . A partir daí, isso funcionaria para o seu caso:

$ ls -lrt ./!(temp_log.*)

Isso requer que a opção extglob shell esteja ativada usando o shopt builtin ( shopt -s extglob ), conforme declarado por Gilles .

    
por 16.10.2012 / 19:00
-1

Apenas faça

ls -ltr 'grep -il patterntosearch  *'
    
por 23.07.2013 / 17:54
-2

Como os arquivos que você DONT deseja imprimir têm "temp_log". no nome do arquivo, então filtre com grep:

ls -lrt | grep -v "temp_log."

NOTA: O outro post com uma resposta semelhante provavelmente recebeu um voto negativo porque o usuário não incluiu "" aspas ao redor da string que o grep deve procurar. Sem as aspas, não funciona como anunciado.

    
por 01.03.2018 / 22:41

Tags