comando de búsqueda: usando {} en una ruta

comando de búsqueda: usando {} en una ruta

Accidentalmente copié las carpetas de mi Musicdirectorio al michaldirectorio 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 findcomando 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:

  1. El orden de -maxdepth 1y -type dse invirtió, ya que man findrecomienda que las opciones globales, como -maxdepth, se definan antes que las opciones posicionales como -type.

  2. 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 $1el nombre del directorio encontrado por . findNecesitamos el llamado shpara hacer la sustitución. La cadena "../$1"está entre comillas dobles para proteger el nombre del directorio $1contra la división de palabras y la expansión de la ruta.

  3. El shell asigna la cadena Rma $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, Dpara incluir los ocultos, y el :tmodificador 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í).

información relacionada