2011-08-17 8 views

risposta

39

La pagina man di rm dice:

-r, -R, --recursive 
      remove directories and their contents recursively 

Ciò significa la bandiera -r si aspetta una directory. Ma *.xml non è una directory.

Se si desidera rimuovere i file .xml tutto dalla directory corrente in modo ricorsivo di sotto è il comando:

find . -name "*.xml" -type f|xargs rm -f 
+4

Non è necessario richiamare xargs; usa 'find -exec'. – paulmelnikow

+1

@ noa..io so ... Ci sono molti modi per fare una cosa simile in Unix. Fino al PO per scegliere quale usare. Avevo appena dato quello che uso regolarmente. – Vijay

+6

@noa In realtà 'xargs' è più efficiente. '-exec' chiama' rm' per ogni file corrispondente, mentre 'xargs' lo fa in lotti. Questo può fare una grande differenza quando ci sono molti file. – suvayu

24

sto supponendo che si desidera rimuovere tutti i file *.xml in modo ricorsivo (all'interno delle directory correnti e di tutte le sottodirectory). Per fare questo, utilizzare find:

find . -name "*.xml" -exec rm {} \; 

Una nota a parte, l'eliminazione ricorsiva mi spaventa. Nei giorni più equilibrati, tendo a precedere quello passo con:

find . -name "*.xml" 

(senza il bit -exec) solo per vedere quello che potrebbe ottenere eliminati prima di prendere il salto. Consiglio che tu faccia lo stesso. I tuoi file ti ringrazieranno.

+0

Sì, voglio farlo per alcuni tipi diversi. Tuttavia, il tuo script non sembra funzionare all'interno di Bash. – Will

+0

Qual è l'output? – paulmelnikow

+0

Non è necessario sfuggire a '{}' - la versione originale andava bene - probabilmente l'OP lo ha semplicemente digitato male. –

2

modo più bello, anche se questo è meno supportato in sistemi UNIX:

rm -rf */*.xml 

rimuoverà i file xml da tutte le sottodirectory della directory corrente.

+0

funzionerà per alberi di directory più profondi di solo 2 livelli? –

3

lettura this answer on finding empty directories unix, ho appena imparato a conoscere l'azione -delete:

-delete 
      Delete files; true if removal succeeded. If the removal failed, an error message is issued. If -delete fails, find's exit status will be nonzero (when it even‐ 
      tually exits). Use of -delete automatically turns on the -depth option. 

      Warnings: Don't forget that the find command line is evaluated as an expression, so putting -delete first will make find try to delete everything below the start‐ 
      ing points you specified. When testing a find command line that you later intend to use with -delete, you should explicitly specify -depth in order to avoid 
      later surprises. Because -delete implies -depth, you cannot usefully use -prune and -delete together. 

Fonte: uomo trova

Ciò significa, è anche possibile eliminare tutti i file XML in modo ricorsivo come questo:

find . -name "*.xml" -type f -delete 
0

Un modo semplice per fare è

rm -f * .xml

Questo rimuoverà tutti i file .xml dal directory corrente.

0

ZSH globbing ricorsivo per il salvataggio!

Invoke zsh: zsh

Assicurati siete nel dir si intende essere in: cd wherever

lista prima: ls **/*.xml

Togliere: rm **/*.xml

Resisterò alla forte tentazione di bash su bash e ju st punto ai documenti zsh rilevanti sull'argomento here.

Problemi correlati