¿Cómo puedo enumerar solo archivos no vacíos usando ls?

Respuestas:

49

Lo usaría find dirname -not -empty -ls, suponiendo que GNU encuentre.

Daenyth
fuente
1
¿A alguien le importa explicar el voto negativo?
Daenyth
Probablemente porque el autor de la pregunta lo pidió lsy usted lo usó find;) Sin embargo
subí
2
Si usa "find. -Not -empty -ls" también incluirá el directorio actual (es decir, "." En su salida), para incluir los archivos actuales use "find. -Type f -not -empty -ls"
user672009
19

Este es un trabajo para encontrar ls no es lo suficientemente poderoso.

find -maxdepth 1 -size +0 -print

-maxdepth 1 - esto le dice a find que busque solo el directorio actual, elimine para buscar en todos los subdirectorios o cambie el número para bajar 2, 3 o más niveles.

-size +0Esto le dice a Find que busque archivos con un tamaño mayor que 0bytes. 0se puede cambiar a cualquier tamaño que desee.

-print le dice a find que imprima la ruta completa al archivo que encuentra

Editar:
adición tardía: probablemente también deba agregar el -type finterruptor anterior. Esto le dice a find que solo busque archivos. Y como se señala en los comentarios a continuación, el -printcambio no es realmente necesario.

Nifle
fuente
1
Para evitar una advertencia, debe colocarla -maxdepth 1antes -size +0. También -printes la acción predeterminada, por lo que no es necesaria.
cYrus
@cYrus - No hay advertencias para mí (cygwin)
Nifle
Las implementaciones findvarían mucho en términos de qué opciones válidas son y hacia dónde pueden ir. GNU find(que es muy común) se producirá una advertencia si se pone -sizeantes -maxdepth.
Telémaco el
10

find dirname -type f ! -empty

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

Si tiene la intención de usar ls, necesita un poco de ayuda de awk.

MaQleod
fuente
7

Ls casi no tiene opción para filtrar archivos: ese no es su trabajo. Filtrar archivos es el trabajo del shell para casos simples (a través de globbing) y el trabajo de encontrar para casos complejos.

En zsh, puede Lusar el calificador global para retener solo archivos cuyo tamaño es> 0 (el .calificador se restringe a los archivos normales):

ls *(.L+0)

Los usuarios de otros shells deben usar find. Con GNU find (como se encuentra principalmente en Linux):

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

Una forma compatible con POSIX es:

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

Si lsno era solo un ejemplo y que simplemente la intención inspección visual, se puede ordenar por tamaño: ls -S.

Gilles 'SO- deja de ser malvado'
fuente
3
 $ find /* -type f ! -size 0

funcionará mejor si desea todos los archivos no vacíos, en lugar de solo directorios.

Trezoide
fuente
1

Bash 4.0+

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