Bash 4+ probado:esta es la forma correcta de buscar el tamaño 0:
find /path/to/dir -size 0 -type f -name "*.xml"
Busque múltiples extensiones de archivo de tamaño 0:
find /path/to/dir -size 0 -type f \( -iname \*.css -o -iname \*.js \)
Nota:Si eliminó \( ... \) los resultados serían todos los archivos que cumplen con este requisito, por lo que se ignoraría el tamaño 0.
Como complemento a las respuestas anteriores:
Si desea eliminar esos archivos
find $dir -size 0 -type f -delete
No, no tienes que molestarte con grep.
find $dir -size 0 ! -name "*.xml"
Para imprimir los nombres de todos los archivos en y debajo de $dir de tamaño 0:
find "$dir" -size 0
Tenga en cuenta que no todas las implementaciones de find
producirá una salida de forma predeterminada, por lo que es posible que deba hacer:
find "$dir" -size 0 -print
Dos comentarios sobre el bucle final en la pregunta:
En lugar de iterar sobre cada palabra de una cadena y ver si los valores alternativos son cero, puede eliminar parcialmente el problema que tiene con los espacios en blanco iterando sobre las líneas. por ejemplo:
printf '1 f1\n0 f 2\n10 f3\n' | while read size path; do
test "$size" -eq 0 && echo "$path"; done
Tenga en cuenta que esto fallará en su caso si alguna de las rutas de salida de ls contiene líneas nuevas, y esto refuerza 2 puntos:no analizar ls
y tener una política de nomenclatura sensata que no permita espacios en blanco en las rutas.
En segundo lugar, para generar los datos del ciclo, no es necesario almacenar la salida en una variable solo para echo
eso. Si simplemente deja que el ciclo escriba su salida en stdout, logrará lo mismo pero evitará almacenarlo.