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.