Esta pregunta es una especie de fase II de la primera pregunta que publiqué aquí
Tengo un directorio que contiene un montón de subdirectorios, archivos .zip y otros archivos aleatorios que no están incluidos en un subdirectorio.
Me gustaría que un script de línea de comando elimine todos los subdirectorios del directorio principal, pero mantenga todos los archivos zip y los archivos sueltos que no pertenecen a ningún subdirectorio. Todos los subdirectorios tienen contenido, así que creo que necesitaría forzar su eliminación con el comando -f.
Básicamente, un comando que mira dentro del directorio principal (o el directorio actual) elimina todas las carpetas de él, pero mantiene el resto del contenido y los archivos que no son una carpeta o están contenidos dentro de una carpeta.
Entiendo que eliminar elementos de la línea de comandos requiere un cuidado especial, pero ya he tomado todas las precauciones necesarias para realizar copias de seguridad de forma remota.
-r
,-R
,--recursive
Son sinónimos que significa "quitar y directorios de forma recursiva su contenido".rm -R ./*/
: también evita problemas con los nombres de guiones.Además de la forma de comodín, también puede usar
find
(al menos GNU find) para hacer esto:Al igual que con otras
find
líneas, puede ejecutar la primera parte (find -mindepth 1 -maxdepth 1 -type d
) para ver una lista de directorios que se eliminarán.Una opción más segura es hacer algo como esto:
cualquiera de los cuales moverá todas las cosas en
../to-rm
lugar de eliminarlas. Puede verificar que hizo lo que quería,rm -Rf
ese directorio en su tiempo libre.fuente
to-rm
yfind
que maneja muy bien los directorios que comienzan con un punto (además de cualquier otro escape engorroso). :)Es posible que desee crear un script para algunas de estas sugerencias, especialmente
rm -R -- */
, y mantenerlo en su carpeta / usr / local / bin; o cree unoalias
en su archivo ~ / .bashrc. Dado que es muy fácil escribir mal un comando y romper su sistema, incluso una sola letra y / o el orden de las letras puede tener consecuencias catastróficas, esto serviría como una solución algo más sólida que tener que escribir las diferentes opciones y argumentos cada vez que quieras realizar esta tarea.Además, es posible que desee incluir la opción
-i or --interactive=once
u-I or --interactive=always
en su secuencia de comandos / comando que servirá como otra herramienta para evitar las eliminaciones no deseadas.Además, algo como derobert sugirió que sería lo mejor; simplemente copie / pegue el script en un editor de archivos / terminales y ajústelo a sus necesidades específicas, y los archivos / directorios se moverán a un solo directorio (cuyo contenido puede verificar / verificar) que simplemente puede eliminar mediante emitiendo el
rm -rf
comando.Otra opción es utilizar una aplicación GUI, como su administrador de archivos, y simplemente seleccionar todos los archivos / carpetas aplicables que desea eliminar. Consulte las páginas del manual de su distribución si no tiene permisos.
Finalmente, si las carpetas están vacías, esencialmente nombres de archivo simples, puede usar el
rmdir
comando para eliminarlas. No funciona para todo lo que desee eliminar, pero será útil en ocasiones cuando desee realizar una "limpieza de la casa". ** Es posible que desee probar la-p --ignore-fail-on-non-empty
opción, que le permitirá eliminar ciertos subdirectorios, así como sus "padres" vacíos, los directorios en los que residen.fuente
Primero debe enumerar los directorios y luego eliminarlos, sin obstaculizar los archivos normales, ls -d * /, solo enumera los subdirectorios, y al canalizarlos con rm se eliminan los directorios y el contenido, manteniendo intactos los archivos sueltos.
Este comando debería hacer el trabajo,
fuente
rm -rf -- */
?printf '%s\0' */ | xargs -r0 rm -rf --
ayudaría (en shells dondeprintf
está integrado y nols
) a evitar errores de listas demasiado grandes , perols -d */ | xargs rm -rf
no agrega nada AFAICT excepto problemas adicionales." .."
(espacio..
), eliminaría el contenido del directorio principal con algunasls
implementaciones. Y no son solo espacios, también son otros caracteres en blanco, nueva línea, comillas simples, comillas dobles, barras invertidas y nombres de archivos que comienzan con-
.printf
para generar una lista donde cada nombre es terminado por el carácter nulo para que pueda procesarsexargs
con la-0
opción, le aconsejo que edite su respuesta para actualizarla con su variación. Estaría bastante seguro de que él estaría feliz de que use su fragmento de código si lo entiende y ha aprendido cómo protege contra el comportamiento indeseable causado por ciertos nombres de archivo que podrían existir.xargs
tiene una ventaja sobre la respuesta aceptada (funciona cuando hay una gran cantidad de archivos / directorios en el directorio actual), por lo que hay margen para editar esto en una respuesta útil. Personalmente, he encontrado que responder a las preguntas de Stack Exchange es una buena experiencia de aprendizaje, especialmente cuando recibo comentarios útiles de otros usuarios.rm -rf <directory name>
. Funciona. Simplemente escribirrm <directory name>
solo conduce a una cantidad de subpreguntas en las que cada uno de los subdirectorios debe eliminarse manualmente. Pero,rm -rf
ayuda a eliminar todo el directorio junto con sus subdirectorios a la vez.fuente