Bash 4+ testé -C'est la bonne façon de rechercher la taille 0 :
find /path/to/dir -size 0 -type f -name "*.xml"
Rechercher plusieurs extensions de fichier de taille 0 :
find /path/to/dir -size 0 -type f \( -iname \*.css -o -iname \*.js \)
Remarque :Si vous supprimez le \( ... \), les résultats seront tous les fichiers qui répondent à cette exigence, ignorant ainsi la taille 0.
En plus des réponses ci-dessus :
Si vous souhaitez supprimer ces fichiers
find $dir -size 0 -type f -delete
Non, vous n'avez pas à vous soucier de grep.
find $dir -size 0 ! -name "*.xml"
Pour imprimer les noms de tous les fichiers dans et en dessous de $dir de taille 0 :
find "$dir" -size 0
Notez que toutes les implémentations de find
produira une sortie par défaut, vous devrez donc peut-être faire :
find "$dir" -size 0 -print
Deux commentaires sur la dernière boucle de la question :
Plutôt que d'itérer sur tous les autres mots d'une chaîne et de voir si les valeurs alternatives sont nulles, vous pouvez partiellement éliminer le problème que vous rencontrez avec les espaces 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 générés par ls contient des retours à la ligne, et cela renforce 2 points :n'analysez pas ls
, et ayez 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
ce. Si vous laissez simplement la boucle écrire sa sortie sur stdout, vous accomplissez la même chose mais évitez de la stocker.