Necesito encontrar directorios vacíos para una lista determinada de directorios. Algunos directorios tienen directorios dentro.
Si los directorios internos también están vacíos, puedo decir que el directorio principal está vacío, de lo contrario no está vacío.
¿Cómo puedo probar esto?
Por ejemplo:
A>A1(file1),A2 this is not empty beacuse of file1
B>B1(no file) this is empty
C>C1,C2 this is empty
Respuestas:
Compruebe si
find <dir> -type f
produce algo. He aquí un ejemplo:fuente
-type f
es.mkdir A B C A/A1 A/A2 B/B1 C/C1 C/C2; touch A/A1/file1
- y ejecuto el código en mi respuesta, informa que B y C están vacíos, como lo requiere el OP. Por lo tanto, tendrá que ser un poco más específico que "no funcionará".Depende un poco de lo que quieras hacer con los directorios vacíos. Utilizo el siguiente comando cuando deseo eliminar todos los directorios vacíos dentro de un árbol, digamos
test
directorio.Una cosa a tener en cuenta sobre el comando anterior es que también eliminará los archivos vacíos , así que use la opción -type d para evitarlo.
Suelta
-delete
para ver los archivos y directorios que coinciden.Si su definición de un árbol de directorios vacío es que no contiene archivos, entonces podrá pegar algo en función de si
find test -type f
devuelve algo.find
es una gran utilidad y RTFM temprano y a menudo para comprender realmente cuánto puede hacer :-)fuente
-empty
, tan conveniente!find test -name ".DS_Store" -delete
primero y luego el-empty delete
comando. También tenga en cuenta, como alpushd
directorio principal, por lo que sefind test
conviertefind .
, pero el resto de los comandos son los mismos.-depth
aquí, es decir, Cause find para realizar un recorrido en profundidad primero, es decir, los directorios se visitan en orden posterior y todas las entradas de un directorio actuarán antes que el directorio mismo. Creo que es relevante aquí.Puede utilizar el siguiente comando:
fuente
Esta es la versión que me pareció más interesante. Si se ejecuta desde el directorio interno , eliminará todos los directorios vacíos a continuación (un directorio se considera vacío si solo contiene directorios vacíos).
La opción mindepth evita que el directorio en sí se elimine si está vacío.
fuente
rmdir --ignore-fail-on-non-empty -p directory
para deshacerse de los padres también.find . -type d -empty
busca y enumera directorios y subdirectorios vacíos en el árbol actual. Por ejemplo, lista resultante de directorios y subdirectorios vacíos:
No se realiza ninguna operación en los directorios. Simplemente se enumeran. Esto funciona para mi.
fuente
Solo encuentra directorios vacíos
Para encontrar directorios vacíos (como se especifica en el título de la pregunta), la respuesta de mosg es correcta:
Pero
-empty
puede que no esté disponible enfind
versiones muy antiguas (este es el caso de HP-UX, por ejemplo). Si este es su caso, consulte las técnicas descritas en la sección siguiente. ¿Hay un directorio vacío? .Eliminar directorios vacíos
Esto es un poco complicado: suponga que un directorio
MyDir
contiene directorios vacíos. Después de eliminar estos directorios vacíos,MyDir
se convertirá en un directorio vacío y también debe eliminarse. Por lo tanto, uso el comandormdir
con la opción--parents
(o-p
) que también elimina los directorios principales cuando es posible:En la
find
versión anterior , la declaración+
aún no es compatible, por lo tanto, puede usar;
en su lugar:¿Está vacío un directorio?
La mayoría de estas respuestas explican cómo comprobar si un directorio está vacío. Por lo tanto, proporciono aquí las tres técnicas diferentes que conozco:
[ $(find your/dir -prune -empty) = your/dir ]
una variacion:
Explicación:
find -prune
es similar afind -maxdepth 0
usar menos caracteresfind -type d
imprime directorios solamentefind -empty
imprime los directorios y archivos vacíos(( ${#files} ))
Este truco es 100%
bash
pero invoca (genera) un sub-shell. La idea es de Bruno De Fraine y mejorada por el comentario de teambob . Te aconsejo este si usasintento y si su script no tiene que ser portátil.Nota: no hay diferencia entre un directorio vacío y uno que no existe (e incluso cuando la ruta proporcionada es un archivo).
[ $(ls -A your/dir) ]
Este truco está inspirado en el artículo de nixCraft publicado en 2007. Andrew Taylor respondió en 2008 y gr8can8dian en 2011.
o la versión bashism de una línea:
Nota:
ls
regresa$?=2
cuando el directorio no existe. Pero no hay diferencia entre un archivo y un directorio vacío.fuente
rmdir -vp
Me ayudó inmensamente, ya que necesitaba no solo eliminar todos los directorios vacíos debajo de una raíz, sino también verificar los directorios vacíos y los directorios principales después de eliminar un archivo. En mi situación, los directorios vacíos están bien siempre que no estén en el árbol del que actualmente estoy eliminando un archivo. ¡Gracias!Esta función recursiva parecería hacer el truco:
Dada esta estructura de directorio de ejemplo:
El resultado de ejecutar esa función sería:
que falla
/dir4/dirD
. Si mueve la llamada recursivafindempty "$dir"
después defi
, la función incluirá ese directorio en sus resultados.fuente
¿Qué tal
rmdir *
? Ese comando fallará en directorios que no estén vacíos.fuente
rmdir */*/* */* *
Aunque eso no maneja 'archivos de puntos' pero luego en situaciones manuales (limpieza de archivos de datos) generalmente no espera 'archivos de puntos'. Los métodos recursivos, sin embargo, son para una limpieza general más automatizada, especialmente en estructuras de directorios muy grandes.El siguiente comando devuelve 1 si un directorio está vacío (o no existe) y 0 en caso contrario (por lo que es posible invertir el código de retorno
!
en un script de shell):fuente
Creé una estructura simple de la siguiente manera:
los
test/test3/file
contiene texto basura.Emitir
find test -empty
devoluciones "test/test2/test2.2
" como el único directorio vacío.fuente
un enfoque simple sería,
además,
fuente
fuente