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.

Stephen Watkins
fonte

Respostas:

23

Tente este:

find . -maxdepth 1 -not -type d
Alexander Gladysh
fonte
3
seja simples: $ find. -type f
bloqueado
9
Não. (1) seria recursivo, (2) não listaria links simbólicos. @ Steve pediu o equivalente a ls .sem diretórios - e aqui está.
Alexander Gladysh 10/03/12
2
Adicionando -lsou -exec ls -l {} \;faria isso ls -lsem diretórios.
21412 Ladadadada
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.

Sean O'Leary
fonte
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

preso
fonte
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.

sandeep.s85
fonte
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.

Pancho
fonte
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.

Kaulbach
fonte
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

Alexx Roche
fonte