2013-07-30 16 views
9

Sto scrivendo uno script che deve cancellare tutto da una directory tranne due directory, mysql e temp.Bash. Cancella tutti i file e le directory ma alcuni

Ho provato questo:

ls * | grep -v mysql | grep -v temp | xargs rm -rf 

ma questo mantiene anche tutti i file che hanno mysql in loro nome, che non ho bisogno. inoltre non cancella altre directory.

qualche idea?

risposta

21

Si può provare:

rm -rf !(mysql|init) 

Quale è POSIX defined:

Glob patterns can also contain pattern lists. A pattern list is a sequence 
of one or more patterns separated by either | or &. ... The following list 
describes valid sub-patterns. 

... 
!(pattern-list): 
    Matches any string that does not match the specified pattern-list. 
... 

Nota: Si prega di tenere il tempo per testarlo prima! O creare qualche cartella di prova, o semplicemente echo la sostituzione di parametro, come opportunamente osservato da @mnagel:

echo !(mysql|init) 

Adding useful information: se la corrispondenza non è attiva, si può abilitare/disabilitare esso utilizzando:

shopt extglob     # shows extglob status 
shopt -s extglob    # enables extglob 
shopt -u extglob    # disables extglob 
+0

funziona come un fascino! Grazie! (sicuramente stava provando da qualche altra parte, non voglio spezzare le cose) – Bobo

+0

Se questo risponde alla tua domanda, segna la risposta come accettata. Entrambi consentono agli altri di sapere che la domanda è stata risolta, in quanto significa riconoscere gli altri sforzi per aiutarti. Per accettare una risposta, fare clic sul segno di spunta, sotto le frecce di votazione. – Rubens

+0

lavorando su di esso. devo aspettare ancora 1 minuto. – Bobo

1

È possibile utilizzare find, ignora mysql e temp, quindi rm -rf.

+4

questo elimina anche i file all'interno delle due cartelle – Bobo

+0

Per non eliminare tutto all'interno di queste cartelle, usa 'find. -maxdepth 1! -iname mysql! -iname temp -exec rm -rf {} \;', o ancora meglio 'find. -maxdepth 1! - inami mysql!-iname temp -delete' – mikewaters

2

Questo è di solito un lavoro per find. Provate il seguente comando (aggiungere -rf se avete bisogno di una cancellazione ricorsiva):

find . -maxdepth 1 \! \(-name mysql -o -name temp \) -exec rm '{}' \; 

(Cioè, trovare le voci in . ma non le sottodirectory che non sono [Named mysql o denominate tmp] e chiamano rm su di loro.)

+0

cancella anche i file all'interno delle due cartelle – Bobo

+0

Non con l'opzione 'maxdepth'. Rimuovi '-exec rm '{}' \;' per ottenere una lista dei file corrispondenti, che non includeranno nulla sotto '. /'. – chrylis

+1

Restituisce anche '.', quindi se stai eseguendo' rm -Rf', potresti potenzialmente cancellare più di quello che intendi ... –

Problemi correlati