Quiero eliminar el directorio B y D. Pero quiero mantener C y todos sus archivos y directorios descendientes. ¿Cuál es el comando para eliminar todos los directorios hijos de un directorio padre, excepto un directorio y sus hijos?
Ayuda apreciada.
filesystem
directory
directory-structure
Joe Saad
fuente
fuente
A
en su ejemplo)? ¿Eliminarlos también o conservarlos?Respuestas:
Lo que quieres es este comando:
Manifestación:
Explicación:
find DIRECTORY
llame al comando find para operar en el DIRECTORIO-mindepth 1
: trabaje solo con el contenido del directorio, evite el directorio en sí mismo que es el nivel 0-maxdepth 1
: evita descender a subdirectorios (derm -rf
todos modos es recursivo, por lo que no necesitamos descender a subdirectorios para eliminarlos)-type d
: busca solo directorios-not \( -name "keepMe" \)
ignore el elemento con el nombre que desea conservar-exec rm -rf {} \;
realizar la eliminación de cada elemento encontradofuente
find
es un buen amigo aquí, pero Bashfor
ytest
son mejores amigos ...>: - DUso de las funciones de glob extendido del shell bash (que están habilitadas por defecto en las instalaciones actuales de Ubuntu)
puede abordar todo, excepto
C
sus contenidos, utilizando la expresión global,A/!(C)
es decirEntonces, para eliminar todo excepto el directorio
C
y su contenido, simplemente puede usardejando
fuente
('"
cuando lo ejecuto de forma remotassh $VM_ADDRESS "rm -rf $APP_FOLDER/!(node_modules)"
. ¿Alguna idea? Muchas gracias.extglob
opción del shell sólo se habilita para las cáscaras interactivas - no estoy seguro si se puede obligarssh
a hacer esoUna manera fácil sería usar trash-cli
puedes instalarlo con
sudo apt-get install trash-cli
una vez instalado, puede navegar al directorio principal A con
cd /A
y luego emitir el comandotrash B D
donde B y D son los directorios que desea eliminar (terminarán en la papelera de la unidad en la que se encuentran, por lo que si comete un error puede recuperar los archivos)Probado en Ubuntu 16.04 y 14.04
fuente
trash ! C
?trash: cannot trash non existent
! ''extglob
embargo, requiere habilitarlo .Simplemente use el
for
bucle de Bash ytest
para filtrar los directorios deseados y elrm -rf
comando para eliminar directorios de forma recursiva, así:Esto itera sobre todos los elementos (archivos y directorios) dentro
/path/to/parent/
y elimina el elemento de forma recursiva si su nombre no es igual adir_survive
. Si el directorio principal es el directorio actual, solo puede escribir*
como ruta.Si no está seguro y quiere probar qué elementos se eliminarían primero sin realizar ninguna acción, simplemente reemplace
rm -rf
el comando anterior conecho
y solo generará los candidatos de eliminación.Aquí hay un ejemplo de ejecución:
fuente