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


Respostas:


49

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


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.


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


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

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


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.


3
 $ find /* -type f ! -size 0

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


1

Bash 4.0+

shopt -s globstar
shopt -s nullglob
for file in **/*; do  test -f "$file" && [[ -s "$file" ]] && echo "$file"; done
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.