Comment trouver tous les fichiers et dossiers vides dans un répertoire spécifique, y compris les fichiers qui semblent vides mais ne le sont pas?

18

Disons que dans mon dossier, ~/listj'ai une grande quantité de dossiers chacun avec leurs propres sous-dossiers et sous-sous-dossiers, etc., et il y a beaucoup de fichiers presque à chaque niveau. Cependant, certains de ces fichiers et dossiers sont vides, alors comment puis-je les parcourir récursivement pour trouver les fichiers et dossiers vides? Et puis les afficher dans une liste d'emplacements de fichiers afin que je sache où chacun est (il devrait également être clair quel est un fichier et quel est un dossier car tous les fichiers n'ont pas d'extensions de fichier). J'utilise Ubuntu GNOME 15.10 avec GNOME 3.18.

Veuillez noter qu'il serait également très utile s'il me disait également si un fichier avait l'air vide mais ne l'était pas (par exemple s'il contenait des espaces ou des sauts de ligne ou quelque chose du genre). Et ferait la différence entre un vrai fichier vide et un qui semble juste vide dans la sortie.


la source
1
Un fichier vide, un fichier sans caractère? (pourrait être des espaces, des sauts de ligne et des tabulations)?
Jacob Vlijm
@JacobVlijm: Eh bien, auparavant, je ne pensais qu'à des fichiers de 0 octet, mais maintenant que vous le mentionnez, quelqu'un a peut-être été assez fou pour me donner un fichier avec des espaces ou des sauts de ligne ou quelque chose, donc je voudrais les détecter aussi, mais je voudrais que la sortie fasse la différence entre un fichier vide réel et un fichier qui semble juste vide.

Réponses:

25

De man find

    -empty File is empty and is either a regular file or a directory.

Donc, pour trouver à la fois des fichiers et des répertoires vides, il suffit de faire

find ~/lists -empty

Pour indiquer le type, vous pouvez utiliser le %yspécificateur de format de sortie

          %y     File's type (like in ls -l), U=unknown type (shouldn't happen)

par exemple

find ~/lists -empty -printf '%y %p\n'

ou utiliser un programme externe comme ls, qui comprend une --classifyoption

    -F, --classify
          append indicator (one of */=>@|) to entries

c'est à dire

find ~/lists -empty -exec ls -Fd {} \;

Si votre définition de `` vide '' est développée pour inclure des fichiers contenant uniquement des espaces, alors cela devient plus compliqué - et plus intensif en calcul, car vous devez maintenant ouvrir au moins tous les fichiers non vides et examiner leur contenu. La façon la plus efficace à laquelle je peux penser du haut de ma tête serait quelque chose comme

find ~/list \( -empty -o \( -type f -a ! -exec grep -qm1 '[^[:blank:]]' {} \; \) \) -exec ls -Fd {} \;

(soit vide, OU un fichier ET grep ne détecte pas au moins un caractère non vide). Mais il y a probablement une meilleure façon.

tournevis
la source
Désolé, j'ai raté quelque chose, veuillez consulter la version modifiée de ma question. Cela ne devrait pas être trop à ajouter.
11

Du ~/listdossier:

find . -empty -type d

pour lister les répertoires vides et

find . -empty -type f

pour lister les fichiers vides.

find . -type f -exec bash -c 'if [ `cat "{}" |wc -w` -eq 0 ]; then echo "file - {}";fi' \; -or -empty -exec bash -c "echo dir - {}" \; 

pour lister les dossiers et fichiers vides, y compris les espaces blancs et les lignes vides

EdiD
la source
Et cela listera-t-il récursivement les sous-dossiers et leur contenu?
cela affichera récursivement les fichiers et dossiers
vides
Désolé, j'ai raté quelque chose, veuillez consulter la version modifiée de ma question. Cela ne devrait pas être trop à ajouter.
[ `grep -c [[:alnum:]] "{}"` -eq 0 ]laissera passer les fichiers contenant uniquement des caractères qui ne sont pas dans l' [A-Za-z0-9]ensemble.
kos
@kos - probablement un graphique à la place alnum fera le travail
EdiD