Come posso eliminare ricorsivamente le directory con i caratteri jolly?


52

Sto lavorando tramite SSH su una WD My Book World Edition. Fondamentalmente vorrei iniziare a un determinato livello di directory e rimuovere ricorsivamente tutte le sottodirectory corrispondenti .Apple*. Come lo farei?

Provai

rm -rf .Apple* e rm -fR .Apple*

né le directory cancellate corrispondenti a quel nome all'interno delle directory secondarie.

Risposte:


73

find è molto utile per eseguire azioni selettive su un intero albero.

find . -type f -name ".Apple*" -delete

Qui, si -type fassicura che sia un file, non una directory, e potrebbe non essere esattamente quello che vuoi poiché salterà anche collegamenti simbolici, socket e altre cose. Puoi usare ! -type d, il che significa letteralmente non directory, ma potresti anche eliminare i caratteri e bloccare i dispositivi. Suggerirei di guardare il -typepredicato nella pagina man per find.

Per farlo rigorosamente con un carattere jolly, è necessario il supporto avanzato della shell. Bash v4 ha l' globstaropzione , che ti consente di abbinare ricorsivamente le sottodirectory usando **. zshe kshsupporta anche questo modello. Usandolo, puoi farlo rm -rf **/.Apple*. Questo non è standard POSIX e non molto portatile, quindi eviterei di usarlo in uno script, ma per un'azione di shell interattiva una tantum, va bene.


3
Posso mettermi find . -type d -name .Apple*al lavoro: elenca tutte le cartelle. Tuttavia, non riesce quando aggiungo -deletealla fine. Torna con il riepilogo dell'utilizzo. Funziona su BusyBox v1.1.1. Questo fa la differenza?
codice

1
-deletenon è neanche POSIX. **è stato introdotto zshnei primi anni '90. Ora è (in ordine cronologico di apparizione) anche in ksh93, fish, bash e tcsh.
Stéphane Chazelas,

1
+1 perrm -rf **/.Apple*
Andriy Boyko,

1
@codedog, se -deletenon funziona usa -exec rm -f {} +invece.
Wildcard il

1
Riesci findad essere prolisso mentre elimina? Suppongo che il metodo "globstar" lo farebbe aggiungendo l'opzione -v.
Demis,

17

Mi sono imbattuto in problemi usando findcon a -deletecausa del comportamento intenzionale di find(cioè rifiutando di eliminare se il percorso inizia con ./, cosa che fanno nel mio caso) come indicato nella sua pagina man:

 -delete

Elimina i file trovati e / o le directory. Restituisce sempre vero. Questo viene eseguito dalla directory di lavoro corrente come trova i reclami lungo l'albero. Non tenterà di eliminare un nome di file con un carattere "/" nel suo percorso relativo a "." per motivi di sicurezza.
L'elaborazione trasversale in profondità è implicita da questa opzione.
I seguenti symlink non sono incompatibili con questa opzione.

Invece, sono stato in grado di farlo

find . -type d -name 'received_*_output' -exec rm -r {} +

Nel tuo caso, sembra che la soluzione sia stata la citazione di glob (asterisco, *), ma volevo fornire la mia risposta nel caso in cui qualcun altro avesse avuto il problema.

NOTA: in precedenza, la mia risposta era quella di fare quanto segue, ma @Wildcard ha sottolineato i difetti di sicurezza nel farlo nei commenti.

find . -type d -name 'received_*_output' | xargs rm -r

1
Nessun buon motivo per usare xargsqui. -exec rm -r {} \;o, meglio, -exec rm -r {} +lo farà anche senza fallire su nomi di file di caratteri speciali. Vedi Perché il looping sull'output di find è una cattiva pratica?
Wildcard il

Buono a sapersi. Non vale un downvote, IMO, poiché il comando esegue ancora il lavoro, ma l'ottimizzazione delle prestazioni è apprezzata.
Pat

1
Se fosse solo un'ottimizzazione delle prestazioni sarei d'accordo con te, ma non lo è. È un buco nella sicurezza. Non stai gestendo correttamente i file con spazi bianchi nei loro nomi e un nome file pericoloso crea la perdita di dati. Vedi anche Implicazioni sulla sicurezza dell'oblio di citare una variabile nelle shell bash / POSIX ; alcuni di questi sono applicabili e potrebbero almeno darti un'idea del tipo di problemi di cui sto parlando.
Carattere jolly

Prova mkdir -p $'blah\nDocuments\n/etc\n/home\n/received__output'nella tua directory ed esegui di nuovo lo stesso comando, se non ritieni che ci sia un potenziale rischio di perdita di dati. In alternativa, dal momento che la domanda è su Mac OS, mkdir -p $'blah\nDocuments\n/Users\n/Applications\n/received__output'. ( Attenzione: eliminerai tutti i tuoi file se lo fai. Questo è un po 'il mio punto.)
Wildcard

0

Ciò che è possibile è che non c'è nulla di sbagliato nel comando rm / find, ma che l'utente con cui si è effettuato l'accesso non disponga effettivamente delle autorizzazioni di eliminazione. Usa ls -lper elencare le cose con le loro autorizzazioni e puoi identificare chi sei con i comandi ide groups(entrambi dovrebbero essere disponibili). Se sei "l'utente sbagliato" per farlo, dovrai modificare le autorizzazioni / proprietà dei file o passare a un altro utente.



-1

Comando semplice:

rm `find ./ -name '.Apple*'` -rf

In bocca al lupo!


4
Questo è estremamente soggetto a errori, trova la chiave -exec.
Anton Barkovsky,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.