Risposte:
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
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 rm
sarà molto più robusto. Significa, tuttavia, che non è possibile utilizzare grep
e utilizzare find
i 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
.
"senza usare altri comandi"
No.
Utilizzando Bash, con globstar
set, sì :
rm basedir/**/my*pattern*
Provalo con ad esempio ls -1
prima, prima rm
di elencare i file corrispondenti.
Puoi impostare le opzioni ad es shopt -s globstar
.
In alternativa, una find
variante 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 rm
nei rm -r
comandi sopra e saltare la corrispondenza solo -type f
nei find
comandi.
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.
Se usi zsh (1) , attiva " setopt extendedglob
globbing 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.