Accidentalmente copié las carpetas de mi Music
directorio al michal
directorio principal. Quiero eliminar estos directorios de una sola vez.
¿Hay alguna manera de hacer que lo siguiente funcione? ¿O hay una mejor alternativa?
/home/michal/Music $ find . -type d -maxdepth 1 -exec rm -r ../{} \;
Evidentemente {}
no se está sustituyendo, porque lo anterior vuelve
rm: ../{}: No such file or directory
rm: ../{}: No such file or directory
rm: ../{}: No such file or directory
...
Respuesta1
Tu find
comando me funciona bien con GNU find
. Si no funciona en su sistema, intente:
find . -maxdepth 1 -type d -exec sh -c 'rm -r "../$1"' Rm {} \;
Este enfoque lo utiliza {}
como argumento independiente, no modificado por ../
. Pasamos el valor de {}
al shell y el shell aplica el ../
.
Notas:
El orden de
-maxdepth 1
y-type d
se invirtió, ya queman find
recomienda que las opciones globales, como-maxdepth
, se definan antes que las opciones posicionales como-type
.El comando de shell debe estar entre comillas simples:
'rm -r "../$1"'
. Si estuviera entre comillas dobles, el shell de origen sustituiría su valor por y se ignoraría$1
el nombre del directorio encontrado por .find
Necesitamos el llamadosh
para hacer la sustitución. La cadena"../$1"
está entre comillas dobles para proteger el nombre del directorio$1
contra la división de palabras y la expansión de la ruta.El shell asigna la cadena
Rm
a$0
. Esto no se utiliza a menos que haya un mensaje de error. En consecuencia, se podría utilizar cualquier cadena.
Respuesta2
Con zsh
:
cd /home/michal &&
rm -rf -- Music/*(/D:t)
El /
calificador global es para seleccionar solo directorios, D
para incluir los ocultos, y el :t
modificador como en la expansión del historial es para seleccionar solo los directorioscola(el nombre del archivo sin su parte del directorio).
Con cualquier caparazón tipo Bourne:
cd /home/michal/Music &&
set -- */ &&
cd .. &&
rm -rf -- "$@"
Sin embargo, una diferencia con lo anterior es que también incluirá enlaces simbólicos a directorios (y eliminará el contenido del destino en lugar del enlace en sí).