113 votes

Trouver tous les fichiers à octet zéro dans le répertoire et les sous-répertoires

Comment puis-je trouver tous les fichiers à octet zéro dans un répertoire et ses sous-répertoires ?

Je l'ai fait :

#!/bin/bash
lns=`vdir -R *.* $dir| awk '{print $8"\t"$5}'`
temp=""
for file in $lns; do
    if test $file = "0"; then
        printf $temp"\t"$file"\n"
    fi
    temp=$file
done

Mais, je n'obtiens des résultats que dans le répertoire courant, pas dans les sous-répertoires, et si un nom de fichier contient un espace, je n'obtiens que le premier mot suivi d'une tabulation.

223voto

William Pursell Points 56211

Pour imprimer les noms de tous les fichiers dans et sous $dir de taille 0 :

find "$dir" -size 0

Notez que toutes les implémentations de find produira une sortie par défaut, donc vous devrez peut-être le faire :

find "$dir" -size 0 -print

Deux commentaires sur la dernière boucle de la question :

Plutôt que d'itérer sur un mot sur deux dans une chaîne de caractères et de voir si les valeurs alternatives sont nulles, vous pouvez partiellement éliminer le problème que vous rencontrez avec les espaces blancs en itérant sur les lignes. ex :

printf '1 f1\n0 f 2\n10 f3\n' | while read size path; do
    test "$size" -eq 0 && echo "$path"; done

Notez que cela échouera dans votre cas si l'un des chemins affichés par ls contient des nouvelles lignes, et cela renforce deux points : ne pas analyser ls et avoir une politique de nommage saine qui n'autorise pas les espaces dans les chemins.

Deuxièmement, pour sortir les données de la boucle, il n'est pas nécessaire de stocker la sortie dans une variable juste pour echo ça. Si vous laissez simplement la boucle écrire sa sortie sur stdout, vous accomplissez la même chose mais évitez de la stocker.

45voto

LinuxLuigi Points 120

En plus des réponses ci-dessus :

Si vous souhaitez supprimer ces fichiers

find $dir -size 0 -type f -delete

9voto

Batcher Points 167

Non, vous n'avez pas à vous soucier de grep.

find $dir -size 0 ! -name "*.xml"

5voto

Mike Q Points 461

Bash 4+ testé - C'est la façon correcte de rechercher la taille 0 :

find /path/to/dir -size 0 -type f -name "*.xml"

Recherche d'extensions de fichiers multiples de taille 0 :

find /path/to/dir -size 0 -type f \( -iname \*.css -o -iname \*.js \)

Note : Si vous supprimez le \( ... \), les résultats seront tous les fichiers qui répondent à cette exigence, ignorant ainsi la taille 0.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X