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,--recursiveSon 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
findlí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-rmlugar de eliminarlas. Puede verificar que hizo lo que quería,rm -Rfese directorio en su tiempo libre.fuente
to-rmyfindque 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 unoaliasen 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=onceu-I or --interactive=alwaysen 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 -rfcomando.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
rmdircomando 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-emptyopció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 dondeprintfestá integrado y nols) a evitar errores de listas demasiado grandes , perols -d */ | xargs rm -rfno agrega nada AFAICT excepto problemas adicionales." .."(espacio..), eliminaría el contenido del directorio principal con algunaslsimplementaciones. 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-.printfpara generar una lista donde cada nombre es terminado por el carácter nulo para que pueda procesarsexargscon la-0opció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.xargstiene 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 -rfayuda a eliminar todo el directorio junto con sus subdirectorios a la vez.fuente