2009-03-17 3 views
12

Sto provando a rimuovere tutte le directory .svn da una directory di lavoro.Perché il mio 'find' non funziona come mi aspetto che usi -exec?

ho pensato di utilizzare solo trovare e rm in questo modo:

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

Ma il risultato è:

ritrovamento: rm -rf ./src/.svn: No such file or directory

Ovviamente il file esiste, o trovare non lo troverebbe ... Cosa mi manca?

+2

Si consiglia di utilizzare -delete con find, se è possibile. Non dimenticare di usare -depth con find quando si utilizza -delete o rm -rf. – ashawley

+0

Assomiglia a -eliminare implica -depth secondo la pagina man. –

risposta

23

Non si deve inserire rm -rf {} tra virgolette singole.

Come hai citato, la shell tratta tutti gli argomenti su -exec come un comando piuttosto che un comando più argomenti, quindi sta cercando un file chiamato "rm -rf ./src/.svn" e non lo trova.

Prova:

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

Sì. Hai entrambi ragione. L'ho capito anche io. –

+0

Penso che l'ultima volta che ho usato -exec era per un grep che avevo bisogno di citare la regex, e così l'avevo nella mia testa. Ringrazia tutti! –

+0

Ho detto "Non ho bisogno" perché sembrava che Sam pensasse di aver bisogno. Tuttavia, vedo che questo è ambiguo e verrà modificato. –

1

È inoltre possibile utilizzare il comando svn come segue:

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

Look here for more info.

+0

Fantastico. Ho pensato che potevo farlo ma non sapevo come esportare la directory di lavoro. Grazie! –

1

Prova

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

e che probabilmente dovrebbe funzionare IIRC.

7

Solo a prima vista, probabilmente si dovrebbe uscire dall'abitudine di usare -exec per cose che possono essere fatte su più file contemporaneamente. Per esempio, avrei scritto che per abitudine come

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

o, dal momento che ora sto usando un computer Macintosh e più probabilità di incontrare nomi di file o directory con spazi tra loro

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

"xargs "fa in modo che" rm "venga invocato solo una volta ogni file" N ", dove" N "è solitamente 20. Non si tratta di una vittoria enorme in questo caso, perché rm è piccolo, ma se il programma si desidera eseguire su ogni file era grande o ha lavorato molto all'avvio, potrebbe rendere le cose molto più veloci.

+0

Fantastico. Controllerò la pagina man per xargs e, per la cronaca, anch'io sono su mac. w00t! –

+1

In alternativa, è possibile terminare la clausola -exec di find con "\ +" anziché "\;", che equivale a utilizzare -print0 e piping su xargs. –

+1

@Adam, che deve essere abbastanza nuovo? Intendiamoci, sono passato a usare Args ai tempi di Ultrix su MicroVax, quindi "nuovo" potrebbe significare "negli ultimi 15-20 anni". –

2

forse il suo solo a me, ma il vecchio trovare & sceneggiatura rm non si lavoro sulla mia configurazione attuale, a la:

find/data/bin/test di tipo d -mtime 10 - nome "[0-9] *" -exec rm -rf {} \;

mentre la soluzione xargs fa, a la:

find/data/bin/test di tipo d -mtime +10 -name '[0-9] *' -print | xargs rm -rf;

idea del perché, ma ho aggiornato il mio ScriptLib così io non spendere altri paio d'ore battendo la mia testa su qualcosa di così semplice ....

(in esecuzione RHEL in kernel-2.6.18- 194.11.3.el5)

EDIT: scoperto perché - i miei RHEL default distro VI per inserire il cr temuta in interruzioni di linea (whch rompe il comando) - dietro suggerimento nx5000 & jliagre a linuxquestions.org, ha aggiunto il seguente a ~/.vimrc:

: impostare fileformat = unix

mappa < F4>: set fileformat = unix < CR>

mappa < F5>: set fileformat = dos < CR>

che permette il comportamento da ruotare su F4/F5.

per verificare se CR di sono incorporati nel file:

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

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

0

Si può passare tutto quello che vuoi tra virgolette, con il seguente trucco.

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

L'opzione exec sarà felice di vedere che si sta semplicemente chiamando un eseguibile con un argomento, ma il vostro argomento sarà in grado di contenere uno script di praticamente qualsiasi dimensione e forma.

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