Eu usaria find dirname -not -empty -ls
, supondo que o GNU encontrasse.
Como posso listar (usando ls
) todos os arquivos que não estão vazios (tamanho > 0) usando o linux?
Este é um trabalho para encontrar ls não é poderoso o suficiente.
find -maxdepth 1 -size +0 -print
-maxdepth 1
- isto diz ao find para pesquisar 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 +0
diz ao find para procurar arquivos com tamanho maior que 0
bytes. 0
pode ser alterado para qualquer tamanho que você desejar.
-print
informa ao find para imprimir o caminho completo para o arquivo que encontrar
Editar:
Adição tardia: provavelmente você também deve adicionar a opção -type f
acima. Isso diz ao find para encontrar apenas arquivos. E, conforme observado nos comentários abaixo, a opção -print
não é realmente necessária.
find dirname -type f ! -empty
O Ls quase não tem opção de filtrar arquivos: esse não é o seu trabalho. Filtrar arquivos é o trabalho do shell para casos simples (através de globbing) e o trabalho de localizar casos complexos.
Em zsh, você pode usar o qualificador L
globbing para reter somente arquivos cujo tamanho seja > 0 (o qualificador .
é restrito a arquivos regulares):
ls *(.L+0)
Usuários de outros shells devem usar 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 ls
não fosse apenas um exemplo e você apenas pretendesse fazer uma inspeção visual, poderia classificá-lo por tamanho: ls -S
.
ls -l | awk '{if ($5 != 0) print $9}'
Se você pretende usar ls
, precisa de uma pequena ajuda de awk
.
$ find /* -type f ! -size 0
funcionará melhor se você quiser todos os arquivos não vazios, em vez de apenas diretórios.
Bash 4.0 +
shopt -s globstar
shopt -s nullglob
for file in **/*; do test -f "$file" && [[ -s "$file" ]] && echo "$file"; done
Tags command-line bash ls linux shell