Como listar arquivos sem diretórios e filtrar por nome (opções ls)

39

Eu tenho um diretório chamado uploads . Ele contém vários arquivos, além de alguns subdiretórios que, por sua vez, contêm arquivos.

Existe uma maneira que eu posso (em um passo) fazer o seguinte:

  1. Lista SOMENTE os arquivos no diretório de uploads raiz - não desejo ver os nomes das subpastas ou seus conteúdos;

    e

  2. NÃO liste nenhum arquivo que comece com t_

Eu sei sobre o sinal -d , mas ele não me entende exatamente o que eu quero.

    
por EmmyS 01.07.2011 / 18:56

9 respostas

50

Isso soa como um trabalho para find .

  • Use -maxdepth para retornar apenas o diretório atual, não procurar recursivamente dentro de subpastas
  • Use -type f para retornar apenas arquivos e não diretórios ou nós de dispositivos ou qualquer outra coisa
  • Use uma combinação se -not e -name para evitar os arquivos com nomes que você não deseja

Ele pode se juntar assim:

find /path/to/uploads -maxdepth 1 -type f -not -name 't_*'
    
por 01.07.2011 / 19:03
18

O GNU ls (ou seja, o comando ls em sistemas Linux não embarcados e o Cygwin, também disponível em outros unices) tem a opção de ocultar alguns arquivos, com base em seus nomes. Não há como ignorar diretórios.

ls --hide='t_*' uploads

Outra abordagem é fazer com que o seu shell faça a correspondência. Bash, ksh e zsh têm um padrão de negação !(t_*) para corresponder a todos os arquivos, exceto os correspondentes a t* ; no bash, esse recurso precisa ser ativado com shopt -s extglob e, em zsh, ele precisa ser ativado com setopt ksh_glob . O Zsh também possui a sintaxe equivalente ^t_* , que precisa ser ativada com setopt extended_glob . Isso ainda não ignora diretórios. O Zsh tem um recurso extra que permite corresponder arquivos não apenas pelo nome, mas também por metadados e mais: glob qualificadores . Adicione (.) no final de uma partida para restringir a arquivos regulares. A negação ^ faz parte da sintaxe de correspondência de nomes, portanto, ^t_*(.) significa “todos os arquivos regulares não correspondem a t_* ” e não “todos os arquivos que não são arquivos regulares correspondentes a t_* ”.

setopt extended_glob  # put this in your ~/.zshrc
ls uploads/^t_*(.)

Se você se encontrar sem ferramentas avançadas, você pode fazer isso em qualquer unix com find . Não é o tipo de coisa que você normalmente digitaria na linha de comando, mas é poderoso e preciso. Caleb tem já mostramos como fazer isso com o GNU find . A opção -maxdepth não é portátil; você pode usar -prune , para portably parar find de recursing.

find uploads/* -type d -prune -o \! -type f -name 't_*' -print

Substitua -print por -exec ls -lG -- {} + para executar ls com suas opções favoritas nos arquivos.

Todos os comandos acima ocultam arquivos dot (ou seja, arquivos cujo nome começa com . ). Se você quiser exibi-los, passe -A para ls ou adicione o qualificador D glob em zsh ( ls uploads/^t_*(.D) ). Com find , você pode usar uma abordagem diferente para reciclar apenas um nível ( find não trata especialmente os arquivos de pontos). Isso só funciona totalmente se você executar find no diretório atual.

cd uploads && find . -name . -o -type d -prune -o \! -type f -name 't_*' -print
    
por 01.07.2011 / 19:53
8
ls -l /folder | grep ^- | awk '{print $9}'
    
por 17.10.2012 / 18:37
1
ls -l | grep -v ^d | grep name$
    
por 03.10.2014 / 18:26
0

Deixe-me dar uma chance usando ls e pipes:

ls  -l --hide='t_*'  uploads/ | grep -v ^d | tr -s ' ' | cut -d ' ' -f 9

a última coluna é a 9ª.

    
por 22.07.2012 / 12:32
0

Se o problema de portabilidade do -maxdepth for uma preocupação, você poderia usar:

ls -l uploads/ | awk '/^-/ && $9 !~/^t_/ {print $9}'

Não sou especialista, mas acho que isso deve funcionar. Eu suponho que isso parece um pouco enigmático, mas se você fala awk, na verdade não é. $ NF pode ser usado em vez de $ 9. Você também pode fazer:

ls -l uploads/ | awk '/^-/' | awk '!/^t_/ {print $9}'

que faz a mesma coisa (mas talvez com menos eficiência que a anterior ???).

Na verdade, depois de pensar nos outros posts, parece que

ls -l --hide=t_* uploads/ | awk '/^-/ {print $9}'

é um caminho ainda mais curto e mais claro.

Alguém por favor me corrija se eu estiver errado. : -)

    
por 23.06.2013 / 09:20
0

Encontrei estas formas curtas:

ls -p uploads | grep -Ev '/'

ou

ls -pIt_* uploads | grep -v /
    
por 27.08.2013 / 22:32
-1

Experimente este alias e use-o:

alias l='ls -hLlF'
    
por 18.05.2016 / 09:18
-1

Fácil:

ls -l --hide 't_*' <absolute path to desired directory> | grep -v ^d

    
por 30.07.2018 / 20:01

Tags