Cuando uso
find /home/user/parentdir -type d -empty -delete
busca recursivamente subcarpetas vacías dentro /home/user/parentdir
y las elimina. Pero si /home/user/parentdir
también está vacío, también elimina la parentdir
carpeta, lo que no es deseable para mí.
Quiero guardar esto parentdir
en rsync
algunos archivos para hacer una copia de seguridad o en la nube. Después del procesamiento, necesito eliminar las carpetas vacías, pero parece improductivo volver a crear parentdir
cada vez.
¿Alguna sugerencia para mantener parentdir
? Pensé en crear un .nocopy
archivo dentro de él y excluirlo rsync
, pero parece excesivo. ¿Hay alguna forma más elegante?
command-line
bash
rsync
find
TNT
fuente
fuente
-mindepth 1
?Respuestas:
Simplemente hazlo
find /home/user/parentdir -mindepth 1 -type d -empty -delete
.Mira:
La
find /home/user/parentdir/*
respuesta en AmourK no es deseable cuando hay muchos archivos y es demasiado complicada.fuente
Al agregar
/*
al final deparentdir
, está realizando la acción en todos los subdirectorios de parentdir en lugar de enparentdir
sí mismo. Y así, de la misma manera,/home/user/
no se elimina en el comando anterior,parentdir
no se eliminará en el siguiente comando.*
se llama operador global y coincide con cualquier cadena de caracteres.find /home/user/parentdir/* -type d -empty -delete
fuente
/home/user/parentdir/
, el globo expandido puede excederARG_MAX
, lo que resulta en un error de lista de argumentos demasiado largo . Puede reducir la posibilidad de que eso suceda cambiando el globo para*/
que solo coincida con los directorios./tmp
, crear un subdirectorio, desempaquetar un tarball comprimido allí, ejecutar el instalador y limpiar. El novato pensó querm -rf /tmp/foo-install
era la forma correcta de hacerlo, y cuando la mano experimentada dijo "Noooooo" en su mejor impresión de Darth-Vader-al-final-del-Episodio III, el novato descubrió de la manera difícil qué tan cerca / y las teclas Enter estaban el uno al otro. Tuvimos que arrancar desde el disco de restauración del software de respaldo y volver a cargar todo el servidor desde la cinta.si tienes php-cli instalado,
fuente
foreach (RecursiveIteratorIterator(RecursiveDirectoryIterator($dir)) as $p) if (empty($skipped)) $skipped = TRUE; elseif ($p->isDir()) @rmdir($p->getPathname());
o algo parecido a eso.$skipped
se encarga de omitir el primero,@rmdir
intenta eliminar un directorio y silenciosamente (esa es la @) falla si no está vacío.Cuando solo necesita un nivel (dejar una carpeta principal, pero eliminar carpetas secundarias vacías), un truco fácil es usar
rmdir
.Elimina todas las subcarpetas vacías, pero solo imprime un error para archivos y carpetas no vacías.
Esto no funciona de forma recursiva, pero al conocer la estructura de su carpeta puede ser la forma más rápida de hacer algo como
Ventaja: fácil de recordar, rápido de escribir, poco potencial para elegir un parámetro incorrecto.
Desventaja: Menos flexible, posiblemente muchos mensajes de error en su terminal.
fuente