Como excluo diretórios ao listar arquivos?


21

Como excluo diretórios ao listar arquivos no diretório atual?

ls .

^ incluirá diretórios na lista.

Respostas:



15

Para obtê-lo exatamente equivalente a ls .você, não é necessário mostrar diretórios ocultos.

find . -maxdepth 1 -not -type d -and -not -name '.*'

e isso ainda deixa você com './' prefixado em cada nome de arquivo. Isso não é realmente um problema, mas acho que é meio feio. Eu fui com:

ls -p | grep -v '/$'

E isso fornecerá uma listagem com a mesma aparência e você também poderá adicionar lsargumentos adicionais . Adicione um --color=alwayse você recuperará as suas cores ou -averá os arquivos ocultos.

Eu gosto da resposta de Alexander, porque ele realmente depende de uma característica do sistema de arquivos do arquivo em questão, para que nunca seja enganado. Minha resposta será enganada por um arquivo que tenha um '/' como o último caractere em seu nome. Mas isso parece estar pedindo problemas.


1
'-não' é GNU encontrar relacionado, já que não é compatível com POSIX, é melhor não ensinar essas opções como um usuário poderia ter habbits "maus" e se sentem perdidos em outros UNIXes :)
jirib

2
@JiriXichtkniha qual é a alternativa POSIX para -not?
Lucas Gallindo

5

tente isto:

$ find. -tipo f -maxdepth 1

ou isto:

$ ls -p | egrep -v / $

$ ls -la | egrep -v ^ d


3

Embora seja um post antigo, mas achei que isso poderia ajudar ..

$ ls -l | grep -v ^ d

Ele listará todos os arquivos, incluindo links simbólicos, caracteres e arquivos de bloco.


Esta resposta já foi fornecida mais de um ano antes por jamded, (produzindo esse ruído visual).
Alexx Roche

2

As soluções "localizar" acima perdem alguns dos recursos do ls - por exemplo: liste apenas arquivos, classificados no tempo de modificação decrescente.

As respostas "ls -p | grep" não lidam elegantemente com outros elementos de ls como -R, caso desejem

A resposta a seguir, embora mais detalhada, na minha opinião reflete o comportamento ls mais verdadeiro e a maior flexibilidade para selecionar "apenas arquivos"

ls -t . | while read line; do
  if [ -f $line ]; then
    echo $line
  fi 
done

Simplesmente substitua as opções ls conforme desejado e o resultado será retornado apenas com arquivos. Se links e outros itens também forem necessários, um pequeno retrabalho precisará ser feito no teste de inclusão.


0
ls $(file --no-pad  -F' '  * | grep -v directory | cut -d' ' -f1)

Com isso, você ainda pode usar outras opções lsnormalmente necessárias. Ou ... remova -vpara listar apenas diretórios. Ou ... substitua o diretório por qualquer outro tipo de arquivo que filecompreenda e relate, como ASCII, vazio, ELF e assim por diante.


Isso não funciona se qualquer um dos nomes de arquivos a serem listados contiver espaços.
Psychonaut

ls -t .|while read f;do [ -f "$f" ]&& echo $f;doneé cerca de 3x mais rápido nos meus testes
Alexx Roche 24/03

0

Eu estava em um sistema em que o findbinário não suportava -note acabei usando:

ls|while read f;do [ -f "$f" ]&& echo $f;done

Vantagens: Não depende de nada além de sh ls echo
É compatível com bash e dash
Pode ser alterado para corresponder a outras coisas (como diretórios), alterando -f
É mais rápido que algumas das respostas e usa menos RAM e CPU

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.