Come faccio a "trovare" escludere la cartella in cui cerca?


18

Sto eseguendo il seguente comando:

find /var/www/html/content/processing -type d -mtime +1 -exec rm -rf {} \;

Vorrei eliminare tutte le cartelle nella processingcartella (la cartella di elaborazione non dovrebbe mai essere eliminata).

Il comando sta eliminando anche la processingcartella. Come posso limitare lo script per eliminare solo le cartelle in quella cartella?


Risposte:


32

Il modo più semplice sarebbe semplicemente aggiungere -mindepth 1, che salterà la prima gerarchia di approfondimenti e quindi tralascerà la directory principale.

Inoltre, non hai bisogno di una -execchiamata extra per rm, puoi solo deletele cartelle direttamente se sono vuote.

find /var/www/html/content/processing -mindepth 1 -type d -mtime +1 -delete

Se non sono vuoti:

find /var/www/html/content/processing -mindepth 1 -type d -mtime +1 -exec rm -rf {} \;

Se sei pigro puoi anche espandere un carattere jolly. Poiché *non include la directory corrente per impostazione predefinita (a meno che non dotglobsia impostata ), puoi anche fare:

find /var/www/html/content/processing/* -type d -mtime +1 -delete

Tuttavia, ciò non include anche le cartelle nascoste, sempre a causa dotglobdell'opzione.


Ciao, ottengo "trova: avviso: hai specificato l'opzione -mindepth dopo un argomento non -type -type, ma le opzioni non sono posizionali (-mindepth influenza i test specificati prima e quelli specificati dopo). Specifica le opzioni prima di altri argomenti "e anche" trova: impossibile eliminare `/ folder / 50d82faf0e09e ': Directory non vuota"
Elad Dotan

Aggiungi mindepth prima di digitare quindi. Per eliminare le directory quando non sono vuote, puoi seguire l'approccio rm che avevi originariamente.
slhck,

4

Il problema è che find restituisce la directory corrente (.) Insieme alle altre directory, quindi elimina la cartella di elaborazione e le sottodirectory. Un modo rapido per aggirare sarebbe quello di aggiungere l'opzione

-not -name .

che interrompe la ricerca dall'output della directory corrente e, a sua volta, ne impedisce l'eliminazione.

Funzionerebbe se si eseguisse il comando all'interno della directory di elaborazione, quindi per consentire il fatto che si sta utilizzando un percorso assoluto:

-not -name /var/www/html/content/processing

E l'intero comando sarebbe:

find /var/www/html/content/processing -type d -mtime +1 -not -name /var/www/html/content/processing -exec rm -rf {} \;

L'ultimo comando è sbagliato. -namesi riferisce a basename, non corrisponde mai a nulla con una barra. Probabilmente devi usare -path.
Kamil Maciorowski il

1

Già risposto, vorrei ancora elencare un altro approccio.

find /var/www/html/content/processing -mindepth 1 -maxdepth 1 -type d

Ciò escluderà la directory superiore (e anche le directory secondarie) e ora puoi applicare qualsiasi comando che vogliamo applicare su di essa.

>> Opzioni:
-mindepth 1: per escludere la directory principale
-maxdepth 1: per evitare l'analisi delle sottodirectory. (Per uno scenario particolare, come indicato, non è necessario).
-type d: elenca solo i tipi di directory. Questa opzione dovrebbe essere disponibile dopo l'utilizzo di mindepth maxdepth.


Perché -maxdepth 1? Perché -type ddue volte? In che modo differisce dalla risposta accettata?
Attie

@Attie: grazie, corretto l'errore. maxdepth non è necessario, ma sarebbe utile se si desidera evitare di elencare le sottodirectory.
prashant
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.