usa rm per rimuovere ricorsivamente file e directory


17

è possibile utilizzare rm per rimuovere ricorsivamente file e directory corrispondenti a un modello senza usare altri comandi?

Risposte:


35

Per rispondere direttamente alla tua domanda "no, non puoi fare ciò che descrivi rm".

È possibile , tuttavia, farlo si combinano con find. Ecco uno dei molti modi per farlo:

 # search for everything in this tree, search for the file pattern, pipe to rm
 find . | grep <pattern> | xargs rm

Ad esempio, se si desidera eseguire l'annullamento di tutti i file * ~, è possibile:

 # the $ anchors the grep search to the last character on the line
 find . -type f | grep '~'$ | xargs rm

Per espandere da un commento * :

 # this will handle spaces of funky characters in file names
 find -type f -name '*~' -print0 | xargs -0 rm

1
vero - se lasci fuori l'ultima pipa, otterrai prima un elenco di tutto :)
warren,

2
Potrebbe non rispondere direttamente alla domanda del poster, ma è il più vicino che otterranno a ciò che vogliono.
Drakia,

1
Un nano, non è un po 'amaro senza motivo?
Gnoupi,

10
Si prega di fare molta attenzione durante l'utilizzo find | grep | xargs rm. Se ci sono file con spazi (o nuove righe), questo si interromperà (e in base ai nomi dei file e alla posizione degli spazi) potrebbe eliminare cose che non si intendeva eliminare. find … -print0 | xargs -0 rmsarà molto più robusto. Significa, tuttavia, che non è possibile utilizzare grepe utilizzare findi predicati per far corrispondere e stampare0 solo i file desiderati. Il secondo esempio di Warren sarà più robusto come find -type f -name '*~' -print0 | xargs -0 rm.
Chris Johnsen,

1
Se si desidera che un singolo comando esegua il lavoro, creare un alias usando uno dei comandi find forniti. Compilerà una risposta per questo in seguito, se lo si desidera.
casualuser,

8

"senza usare altri comandi"

No.


Bella risposta che illustra il dibattito "rispondi rigorosamente alla domanda iniziale (a rischio di non essere in grado di fornire una soluzione)" vs. "fornire una soluzione, anche se non corrisponde strettamente alle restrizioni imposte".
Gnoupi,

L'ho pubblicato solo come "A Dwarf" si lamentava della risposta che forniva effettivamente una soluzione. Senza usare altri comandi non c'è davvero modo di fare la cancellazione di file ricorsiva che corrisponde a un modello, solo la cancellazione di file / directory della directory corrente.
Drakia,

3

Utilizzando Bash, con globstarset, :

rm basedir/**/my*pattern*

Provalo con ad esempio ls -1prima, prima rmdi elencare i file corrispondenti.

Puoi impostare le opzioni ad es shopt -s globstar.


In alternativa, una findvariante più breve :

find -type f -name 'my*pattern*' -delete

o per GNU find:

find -type f -name 'my*pattern*' -exec rm {} +

o un'altra alternativa per non GNU find(un po 'più lento):

find -type f -name 'my*pattern*' -exec rm {} \;

Per rimuovere anche le directory, come richiesto: basta cambiare rmnei rm -rcomandi sopra e saltare la corrispondenza solo -type fnei findcomandi.


0

Avrei aspirato "rm -rf" dove si trova una combinazione di nomi di file e schemi corrispondenti come * e? ecc. (ad esempio oggis_log_2009 ????. log). Ciò inizierà dalla Dir corrente e procederà verso il basso rimuovendo ricorsivamente i file che macth quel modello.


Questo non funzionerà perché il pattern viene espanso dalla shell nella directory corrente. Se citato, il modello diventa un nome file con caratteri speciali al suo interno. ad es. per cancellare il file [, si potrebbe scrivere rm '['. Il modello perde semplicemente il suo significato.
casualuser,

0

Se usi zsh (1) , attiva " setopt extendedglobglobbing esteso" con in .zshrc. Il prefisso del modello con '** /' eliminerà quindi in modo ricorsivo:

% rm -rf ** / <modello>

Tuttavia, se ci sono molti file da eliminare, dovresti ricorrere a find (1) con xargs (1) o -exec, e ti consiglio di farlo anche negli script di shell.

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.