Como posso listar apenas arquivos não vazios usando ls?

36

Como posso listar (usando ls) todos os arquivos que não estão vazios (tamanho> 0) usando o linux?

David B
fonte

Respostas:

49

Eu usaria find dirname -not -empty -ls, assumindo o GNU find.

Daenyth
fonte
1
Alguém se importa em explicar o voto negativo?
Daenyth
Provavelmente porque o consulente pediu lse você usou find;) eu levantei embora ... É uma solução adequada
BloodPhilia
2
Se você usar "find. -Not -empty -ls", ele também incluirá o diretório atual (ou seja, "." Na saída), para incluir apenas os arquivos atuais, use "find. -Type f -not -empty -ls"
user672009
19

Este é um trabalho para encontrar ls não é poderoso o suficiente.

find -maxdepth 1 -size +0 -print

-maxdepth 1 - indica para procurar apenas o diretório atual, remover para procurar em todos os subdiretórios ou alterar o número para descer 2, 3 ou mais níveis.

-size +0isso indica para procurar arquivos com tamanho maior que 0bytes. 0pode ser alterado para qualquer tamanho que você desejar.

-print diz ao find para imprimir o caminho completo para o arquivo que encontra

Editar:
adição tardia: você provavelmente também deve adicionar a -type fopção acima. Isso indica para localizar apenas arquivos. E, como observado nos comentários abaixo, a -printopção não é realmente necessária.

Nifle
fonte
1
Para evitar um aviso, você deve colocar -maxdepth 1antes -size +0. Também -printé a ação padrão, portanto não é necessária.
Cyrus
@cYrus - Nenhuma advertência para mim (cygwin)
Nifle
As implementações findvariam muito em termos de quais são as opções válidas e para onde podem ir. GNU find(que é muito comum) vai produzir um aviso se você colocar -sizeantes -maxdepth.
Telêmaco
10

find dirname -type f ! -empty

Joril
fonte
8
ls -l | awk '{if ($5 != 0) print $9}'

Se você pretende usar ls, precisará de uma pequena ajuda awk.

MaQleod
fonte
7

O Ls quase não tem opção para filtrar arquivos: esse não é o seu trabalho. A filtragem de arquivos é o trabalho do shell para casos simples (através de globbing) e o trabalho de localização de casos complexos.

No zsh, é possível que o Lqualificador de globbing retenha apenas arquivos cujo tamanho seja> 0 (o .qualificador se restringe a arquivos regulares):

ls *(.L+0)

Usuários de outros shells devem usar o find. Com o GNU find (como encontrado principalmente no Linux):

find -maxdepth 1 -type f ! -empty -exec ls {} +

Uma maneira compatível com POSIX é:

find . -type f -size +0c -exec ls {} + -o -name . -o -prune

Se lsnão era apenas um exemplo e você simplesmente a intenção de inspeção visual, você pode classificar por tamanho: ls -S.

Gilles 'SO- parar de ser mau'
fonte
3
 $ find /* -type f ! -size 0

funcionará melhor se você quiser todos os arquivos não vazios, em vez de apenas diretórios.

Trezoid
fonte
1

Bash 4.0+

shopt -s globstar
shopt -s nullglob
for file in **/*; do  test -f "$file" && [[ -s "$file" ]] && echo "$file"; done
user31894
fonte