¿Cómo encontrar todos los archivos y carpetas vacíos en un directorio específico, incluidos los archivos que parecen vacíos pero no lo están?

18

Digamos que en mi carpeta ~/listtengo una gran cantidad de carpetas, cada una con sus propias subcarpetas y subcarpetas, etc., y hay muchos archivos casi en cada nivel. Sin embargo, algunos de estos archivos y carpetas están vacíos, entonces, ¿cómo puedo buscar recursivamente a través de todos ellos para encontrar los archivos y carpetas vacíos? Y luego haga que se muestren en una lista de ubicaciones de archivos para que sepa dónde está cada uno (también debe quedar claro cuál es un archivo y cuál es una carpeta porque no todos los archivos tienen extensiones de archivo). Estoy ejecutando Ubuntu GNOME 15.10 con GNOME 3.18.

Tenga en cuenta que también sería muy útil si también me dijera si un archivo parecía vacío pero no lo estaba (por ejemplo, si tenía espacios o saltos de línea o algo así). Y diferenciaría entre un archivo vacío real y uno que solo parece vacío en la salida.


fuente
1
Un archivo vacío, ¿es un archivo sin caracteres? (podrían ser espacios, saltos de línea y pestañas)?
Jacob Vlijm el
@JacobVlijm: Bueno, antes estaba pensando solo en archivos de 0 bytes, pero ahora que lo mencionas, alguien podría haber estado lo suficientemente loco como para darme un archivo con espacios o saltos de línea o algo así, por lo que me gustaría detectarlos también, pero me gustaría que la salida diferencie entre un archivo vacío real y uno que solo parece vacío.

Respuestas:

25

Desde man find

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

Entonces, para encontrar archivos y directorios vacíos, es suficiente hacer

find ~/lists -empty

Para indicar el tipo, puede usar el %yespecificador de formato de salida

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

p.ej

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

o hacer uso de un programa externo como ls, que incluye una --classifyopción

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

es decir

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

Si su definición de 'vacío' se expande para incluir archivos que contienen solo caracteres de espacio en blanco, entonces se vuelve más complicado, y más computacionalmente intensivo, ya que ahora necesita abrir al menos cualquier archivo no vacío y examinar su contenido. La forma más eficiente en que puedo pensar fuera de mi cabeza sería algo así como

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

(ya sea vacío, O un archivo Y grep no detecta al menos un carácter que no esté en blanco). Probablemente hay una mejor manera sin embargo.

conductor de acero
fuente
Lo siento, me perdí algo, mira la versión editada de mi pregunta. No debería ser demasiado para agregar.
11

De ~/listcarpeta:

find . -empty -type d

para listar directorios vacíos y

find . -empty -type f

para listar archivos vacíos.

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

para enumerar carpetas y archivos vacíos, incluidos espacios en blanco y líneas vacías

EdiD
fuente
¿Y esto incluirá recursivamente subcarpetas y sus contenidos también?
esto mostrará de forma recursiva archivos y carpetas
vacíos
Lo siento, me perdí algo, mira la versión editada de mi pregunta. No debería ser demasiado para agregar.
[ `grep -c [[:alnum:]] "{}"` -eq 0 ]dejará pasar archivos que contengan solo caracteres que no estén en el [A-Za-z0-9]conjunto.
kos
@kos - probablemente el gráfico en su lugar alnum hará el trabajo
EdiD