rimuovere solo le cartelle vuote con flag vuoto - è sicuro


0

creiamo il seguente comando per rimuovere solo le cartelle vuote più vecchie di 100min

find /tmp -type  d -empty -mmin +100 -printf '%p was deleted!!\n' -delete

perché intendiamo eseguirlo dal cron job sulle macchine di produzione

vogliamo capire se il flag vuoto ignorerà anche le cartelle con collegamenti o file vuoti

o in altre parole come bandiera vuota controlla la cartella?


Vuoto significa vuoto. Una directory che contiene qualsiasi cosa (collegamenti simbolici, altre directory, file regolari vuoti o meno, file di dispositivi, socket, qualunque cosa) non è vuota.
AlexP

@AlexP Direi che è una risposta anziché un commento. Se lo
pubblichi

Test, test, test
Jeff Schaller

Prova? cosa intendi per test? (è difficile coprire tutti i casi)
yael

@yael Ti vedo chiedere informazioni sulla sicurezza e l'esecuzione del codice in produzione. Avere un sistema di test e creare casi di test e così via. Nessuno qui può testare il tuo ambiente come puoi.
Jeff Schaller

Risposte:


4

Vuoto significa vuoto. Se esiste un tipo di file in una directory, la directory non è vuota. Illustrare:

$ mkdir dir{1..8}; \
  ln -s /etc/ dir1/workingLink; \
  ln -s noSuchFile dir2/brokenLink;  \
  mkfifo dir3/fifo; 
  touch dir4/emptyFile; \
  echo foo > dir5/nonEmptyFile; \
  touch dir6/.hiddenFile; \
  mkdir dir7/subdir
$ tree -a
.
├── dir1
   └── workingLink -> /etc/
├── dir2
   └── brokenLink -> noSuchFile
├── dir3
   └── fifo
├── dir4
   └── emptyFile
├── dir5
   └── nonEmptyFile
├── dir6
   └── .hiddenFile
├── dir7
   └── subdir
└── dir8

Quindi, abbiamo una directory con un link simbolico funzionante, una con un link non funzionante (che punta a un file inesistente), una con un FiFo (una named pipe), una con un file vuoto, una con un file che non lo è vuoto, uno con un file nascosto, uno con una sottodirectory e solo uno vuoto. Quale verrà eliminato?

$ find . -type d -empty -printf '%p WAS DELETED!\n' -delete \
                        -or -printf '%p: not empty!\n'
./dir8 WAS DELETED!
./dir3/fifo: not empty!
./dir3: not empty!
./dir5/nonEmptyFile: not empty!
./dir5: not empty!
./dir6/.hiddenFile: not empty!
./dir6: not empty!
./dir2/brokenLink: not empty!
./dir2: not empty!
./dir4/emptyFile: not empty!
./dir4: not empty!
./dir7/subdir WAS DELETED!
./dir7 WAS DELETED!
./dir1/workingLink: not empty!
./dir1: not empty!
.: not empty!

Quindi, sono state eliminate tre cose:

  1. La directory vuota dir8.
  2. La (sotto) directory vuota dir7/subdir
  3. La directory (ora) vuota dir7. Questo è stato eliminato perché findprima è stato eliminato dir7/subdire quindi dir7era vuoto, quindi è stato eliminato anche.

Pertanto, qualsiasi tipo di contenuto in una directory impedirà che venga eliminato da questo comando, ma è necessario fare attenzione nel caso in cui l'unica cosa in una directory siano altre directory vuote. In tal caso, il findcomando eliminerà anche la directory principale poiché sarà vuota al termine.

Se non vuoi rimuovere le sottodirectory che potrebbero causare la rimozione di un genitore, con GNU find (il default su Linux) puoi usare il -maxdepthflag per limitare findsolo alla directory corrente:

$ find . -maxdepth 1 -type d -empty -printf '%p WAS DELETED!\n' \
                                    -delete -or -printf '%p: not empty!\n'
./dir8 WAS DELETED!
./dir3: not empty!
./dir5: not empty!
./dir6: not empty!
./dir2: not empty!
./dir4: not empty!
./dir7: not empty!
./dir1: not empty!
.: not empty!
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.