Comment puis-je répertorier uniquement les fichiers non vides à l'aide de ls?

36

Comment lister (utiliser ls) tous les fichiers qui ne sont pas vides (taille> 0) en utilisant linux?

David B
la source

Réponses:

49

J'utiliserais find dirname -not -empty -ls, en supposant que GNU trouve.

Daenyth
la source
1
Quelqu'un veut-il expliquer le downvote?
Daenyth
Probablement parce que le demandeur a demandé lset que vous avez utilisé find;) J'ai augmenté cependant ... C'est une bonne solution
BloodPhilia
2
Si vous utilisez "find. -Not -empty -ls", il inclura également le répertoire courant (c'est-à-dire "." Dans sa sortie), pour simplement inclure les fichiers actuels, utilisez "find. -Type f -not -empty -ls"
user672009
19

C'est un travail pour trouver que ls n'est pas assez puissant.

find -maxdepth 1 -size +0 -print

-maxdepth 1 - cela indique à find de rechercher le répertoire actuel uniquement, de supprimer pour rechercher dans tous les sous-répertoires ou de changer le nombre pour descendre de 2, 3 niveaux ou plus.

-size +0cela indique à find de rechercher des fichiers dont la taille est supérieure à 0octets. 0peut être changé en n'importe quelle taille que vous souhaitez.

-print indique à find d'imprimer le chemin complet du fichier qu'il trouve

Edit:
ajout tardif: vous devriez probablement également ajouter le -type fcommutateur ci-dessus. Cela indique à find de ne rechercher que les fichiers. Et comme indiqué dans les commentaires ci-dessous, le -printcommutateur n'est pas vraiment nécessaire.

Fusil
la source
1
Pour éviter un avertissement, vous devez placer -maxdepth 1avant -size +0. Est également -printl'action par défaut, donc elle n'est pas nécessaire.
cYrus
@cYrus - Aucun avertissement pour moi (cygwin)
Nifle
Les implémentations de findvarient considérablement en termes de ce que sont les options valides et où elles peuvent aller. GNU find(qui est terriblement commun) va produire un avertissement si vous mettez -sizeavant -maxdepth.
Télémaque
10

find dirname -type f ! -empty

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

Si vous avez l'intention d'utiliser ls, vous avez besoin d'un peu d'aide awk.

MaQleod
la source
7

Ls n'a presque aucune option pour filtrer les fichiers: ce n'est pas son travail. Le filtrage des fichiers est le travail du shell pour les cas simples (par globbing) et le travail de recherche pour les cas complexes.

Dans zsh, vous pouvez le Lqualificatif globbing pour conserver uniquement les fichiers dont la taille est> 0 (le .qualificatif se limite aux fichiers normaux):

ls *(.L+0)

Les utilisateurs d'autres shells doivent utiliser find. Avec GNU find (comme on le trouve principalement sur Linux):

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

Une manière conforme POSIX est:

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

Si lsétait non seulement un exemple et vous simplement l' intention inspection visuelle, vous pourriez trier par taille: ls -S.

Gilles, arrête de faire le mal
la source
3
 $ find /* -type f ! -size 0

fonctionnera mieux si vous voulez tous les fichiers non vides, plutôt que seulement les répertoires.

Trezoid
la source
1

Bash 4.0+

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