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

16

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 eu preciso verificar.

Como posso listar facilmente todos os arquivos e impedir temp_log.$$que eles sejam exibidos?

Saída esperada

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

Passei pela lspágina de manual, mas não encontrei nada nessa referência. Entre em contato se tiver perdido alguma informação vital aqui.

obrigado

mtk
fonte
no BASH, ls --hide='temp_log.$$'deve funcionar. Você também pode / deve estender isso com caracteres curinga, dependendo de qual parte de todo o termo temp_log.$$é.
erch 23/07

Respostas:

25

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

ls -I 'temp_log.*' -lrt

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

Com o zsh, você pode deixar o shell fazer a filtragem. Passe -dpara lspara 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 ksh. No zsh, execute setopt ksh_globprimeiro. No bash, execute shopt -s extglobprimeiro.

ls -dltr !(temp_log.*)
Gilles 'SO- parar de ser mau'
fonte
Por favor, não aspas simples no exemplo para GNU ls: ls -I 'temp_log. *' -Lrt Eles são necessários para passar o padrão para o comando e não deixar que o shell o expanda.
shargors
No Ubuntu bash v4.3.48, ele deve ficar -Itemp_log.*sem espaço após o-I
Yan King Yin
1
@YanKingYin Não, é bom ter um espaço após o -I. No entanto, as *necessidades devem ser citadas de uma maneira ou de outra. -I temp_log.*não trabalha, mas -I 'temp_log.*', -I "temp_log.*", -I temp_log.\*, etc. são muito bem.
Gilles 'SO- stop be evil'
10

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

ls -lrt | grep -v <exclude-filename-part>
andrade
fonte
1
Não sei por que isso foi prejudicado, é a resposta correta.
Tim Kennedy
5
Fazer um grep na saída ls nem sempre é correto e não é recomendado. Tem efeitos colaterais. Não é possível recuperar problemas exatos. Nota lateral - para baixo votação não foi de mim;)
mtk
1
Aqui está o link sobre por que analisar ls é uma má idéia .
mtk
3

Você pode usar findpara isso:

find . \! -name 'temp_log*'

Isso imprimirá apenas os nomes, você pode adicionar -lspara criar uma ls -lsaída de estilo com registro de data e hora e permissões, ou usar -exec ls {} +para realmente passar para ls com as opções desejadas 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, convém evitar listá-los recursivamente

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

E se você usar ls, deverá passar a opção -d para impedir que ela seja listada nos diretórios:-exec ls -d {} +

Random832
fonte
Provavelmente também quero -maxdepth 1imitar não recursivo ls.
jw013
Agradável. Os usuários que possuem um POSIX mais mínimo findsem -maxdepth devem procurar aqui .
Wildcard
2

Eu acho que você deseja usar um recurso do shell, não de ls. Como uso o bash, verifiquei o que você deseja man bash. Procure por "^ EXPANSÃO", (pressionando primeiro '/'). Excerto:

EXPANSÃO

    A expansão é realizada na linha de comando após ter sido dividida em palavras. Existem tipos sete da expansão realizada: expansão cinta , tilde expansão , parâmetro e expansão de variáveis , substituição de comandos , expansão aritmética , dividindo palavra , e expansão de nome .

   ︙
... <recorte> ...
   ︙

Expansão do nome do caminho

    Depois de repartição de palavras, a menos que o -f opção tiver sido definido, o bash verifica cada palavra para os personagens *, ?e [. Se um desses caracteres aparecer, a palavra será considerada um padrão e substituída por uma lista classificada alfabeticamente de nomes de arquivos que correspondem ao padrão. ...

Recentemente, comecei a excluir arquivos com base na primeira letra, 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 colchetes, também excluirá os arquivos que começam com essas letras.

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 extglobopção shell seja ativada usando o shoptbuiltin ( shopt -s extglob), conforme declarado por Gilles .

Alex Leach
fonte
-1

Apenas faça

ls -ltr `grep -il patterntosearch  *`
user43658
fonte
grepprocura um padrão em um arquivo, e não no nome do arquivo.
23413 evilsoup
-2

Como os arquivos que você NÃO deseja imprimir têm "temp_log". no nome do arquivo e filtre com grep:

ls -lrt | grep -v "temp_log."

NOTA: A outra postagem com uma resposta semelhante provavelmente recebeu votos negativos porque o usuário não incluiu aspas "" ao redor da string que o grep deveria estar procurando. Sem as aspas, ele não funciona como anunciado.

user185160
fonte
Sua 'NOTA' não está estritamente correta. Existem certos caracteres que podem precisar ser citados, mas acho que não há nenhum nessa sequência em particular.
smokes2345
até que exista um usuário ou grupo chamado "temp_log" (o ponto no regex corresponderia a um espaço ou a qualquer coisa a seguir temp_log. Esta não é uma boa maneira (geral) de excluir lsresultados.)
Jeff Schaller
somente com -F@ smokes2345; um período corresponderá a qualquer caractere em uma expressão regular básica. Veja: unix.stackexchange.com/q/119905/117549
Jeff Schaller