2009-03-17 11 views
12

Estoy tratando de eliminar todos los directorios .svn de un directorio de trabajo.¿Por qué mi 'buscar' no funciona como esperaba usar -exec?

pensé que iba a encontrar y sólo tiene que utilizar rm así:

find . -iname .svn -exec 'rm -rf {}' \; 

Pero el resultado es:

hallazgo: rm-rf ./src/.svn: No existe el fichero o directorio

Obviamente el archivo existe, o no lo encontraría ... ¿Qué me estoy perdiendo?

+2

Realmente debería usar -delete con find, si puede. No olvides utilizar -depth con find cuando usas -delete o rm -rf. – ashawley

+0

Parece que -delete implica -depth según la página man. –

Respuesta

23

No debe poner el rm -rf {} entre comillas simples.

Como lo ha citado, el shell trata todos los argumentos como -exec como un comando en lugar de como un comando más argumentos, por lo que busca un archivo llamado "rm -rf ./src/.svn" y no lo encuentra.

Probar:

find . -iname .svn -exec rm -rf {} \; 
+0

Sí. Ambos tienen razón. Me di cuenta de eso también. –

+0

Creo que la última vez que utilicé -exec fue para un grep que necesitaba citar la expresión regular, y entonces tuve eso en mi cabeza. ¡Gracias a todos! –

+0

Dije "No necesito" porque parecía que Sam pensó que lo necesitaba. Sin embargo, veo que esto es ambiguo y se editará. –

1

también puede utilizar el comando svn de la siguiente manera:

svn export <url-to-repo> <dest-path> 

Look here for more info.

+0

Impresionante. Pensé que podría hacerlo, pero no sabía cómo exportar el directorio de trabajo. ¡Gracias! –

1

Trate

find . -iname .svn -exec rm -rf {} \; 

y que, probablemente, se debe trabajar IIRC.

7

Solo por el momento, probablemente debería dejar el hábito de usar -exec para cosas que se pueden hacer en varios archivos a la vez. Por ejemplo, me gustaría escribir que de costumbre como

find . -iname .svn -print | xargs rm -rf 

o, ya que ahora estoy usando un Macintosh y más probabilidades de encontrarse con los nombres de archivo o directorio con espacios en ellos

find . -iname .svn -print0 | xargs -0 rm -rf 

"xargs "se asegura de que" rm "se invoque solo una vez cada" N ", donde" N "suele ser 20. Eso no es una gran ganancia en este caso, porque rm es pequeño, pero si el programa que desea ejecutar en cada archivo fue grande o se procesó mucho en el inicio, podría hacer las cosas mucho más rápidas.

+0

Impresionante. Revisaré la página del manual para xargs, y para el registro, también estoy en un mac. w00t! –

+1

Alternativamente, puede finalizar la cláusula -exec de búsqueda con "\ +" en lugar de "\;", que es equivalente a usar -print0 y piping a xargs. –

+1

@ Adam, ¿debe ser bastante nuevo? Eso sí, cambié a usar args en los días de Ultrix en MicroVax, por lo que "nuevo" podría significar "en los últimos 15-20 años". –

2

quizás yo, pero el viejo guión encontrar & rm no se trabajo en mi configuración actual, al estilo de:

hallazgo/data/bin/test de tipo d -mtime 10 - nombre "[0-9] *" -exec rm -rf {} \;

mientras que la solución xargs hace, al estilo de:

hallazgo/data/bin/test de tipo d -mtime 10 -nombre '[0-9] *' -print | xargs rm -rf;

ni idea de por qué, pero he actualizado mi ScriptLib así que no pasar otro par de horas batiendo mi cabeza en algo tan simple ....

(que se ejecuta bajo RHEL kernel-2.6.18- 194.11.3.el5)

EDITAR: descubrió porqué - mis RHEL por defecto distribuciones VI para insertar el cr temida en los saltos de línea (apartada rompe el comando) - siguiendo las sugerencias de nx5000 & jliagre en linuxquestions.org, agregó lo siguiente a ~/.vimrc:

: set FileFormat = UNIX

mapa < F4>: Conjunto FileFormat = UNIX < CR>

mapa < F5>: set FileFormat = dos < CR>

que permite el comportamiento para pivotar en el F4/F5.

para comprobar si CR están incrustados en el archivo:

cabeza -1 scriptFile.sh | od -c | cabeza -1

http://www.linuxquestions.org/questions/linux-general-1/bad-interpreter-no-such-file-or-directory-213617/

0

Usted puede pasar cualquier cosa que desee entre comillas, con el siguiente truco.

find . -iname .svn -exec bash -c 'rm -rf {}' \; 

La opción exec será feliz de ver que usted es simplemente llamar a un ejecutable con un argumento, pero su argumento será capaz de contener una secuencia de comandos de básicamente cualquier tamaño y forma.

find . -iname .svn -exec bash -c ' 
    ls -l "{}" | wc -l 
' \; 
Cuestiones relacionadas