<Precedenti | Contenuti | Succ.>
Un ritorno al parco giochi
È tempo di mettere Find per un uso (quasi) pratico. Creeremo un parco giochi e metteremo in pratica alcune delle cose che abbiamo imparato.
Per prima cosa, creiamo un playground con molte sottodirectory e file:
[io@linuxbox~]$ mkdir -p parco giochi/dir-{001..100}
[io@linuxbox~]$ tocca playground/dir-{001..100}/file-{A..Z}
[io@linuxbox~]$ mkdir -p parco giochi/dir-{001..100}
[io@linuxbox~]$ tocca playground/dir-{001..100}/file-{A..Z}
Lasciatevi stupire dalla potenza della riga di comando! Con queste due righe, abbiamo creato una directory playground contenente 100 sottodirectory, ciascuna contenente 26 file vuoti. Provateci con l'interfaccia grafica!
Il metodo che abbiamo impiegato per realizzare questa magia prevedeva un comando familiare (mkdir), un'espansione shell esotica (parentesi graffe) e un nuovo comando, toccare. Combinando mkdir con la -p opzione (che causa mkdir per creare le directory padre dei percorsi specificati) con l'espansione delle parentesi graffe, siamo riusciti a creare 100 sottodirectory.
. toccare Il comando viene solitamente utilizzato per impostare o aggiornare gli orari di accesso, modifica e modifica dei file. Tuttavia, se un argomento filename è quello di un file inesistente, viene creato un file vuoto.
Nel nostro parco giochi, abbiamo creato 100 istanze di un file denominato file-A. Troviamoli:
[io@linuxbox~]$ trova playground -tipo f -nome 'file-A'
[io@linuxbox~]$ trova playground -tipo f -nome 'file-A'
Nota che a differenza ls, Find non produce risultati ordinati. Il suo ordine è determinato dal layout del dispositivo di archiviazione. Possiamo confermare che abbiamo effettivamente 100 istanze del file in questo modo:
[io@linuxbox~]$ trova playground -tipo f -nome 'file-A' | wc -l
100
[io@linuxbox~]$ trova playground -tipo f -nome 'file-A' | wc -l
100
Ora, vediamo come trovare i file in base alla loro data di modifica. Questo sarà utile quando si creano backup o si organizzano i file in ordine cronologico. Per fare ciò, creeremo prima un file di riferimento con cui confrontare la data di modifica:
[io@linuxbox~]$ area giochi touch/timestamp
[io@linuxbox~]$ area giochi touch/timestamp
Questo crea un file vuoto denominato timestamp e imposta l'ora di modifica sull'ora corrente. Possiamo verificarlo utilizzando un altro comando utile, stat, che è una specie di versione potenziata di ls. stat il comando rivela tutto ciò che il sistema comprende
informazioni su un file e sui suoi attributi:
[io@linuxbox~]$ parco giochi statistico/timestamp
File: `playground/timestamp'
Dimensione: 0 Blocchi: 0 Blocco IO: 4096 file vuoto normale Dispositivo: 803h/2051d Inode: 14265061 Collegamenti: 1
Accesso: (0644/-rw-r--r--) Uid: ( 1001/ me) Gid: ( 1001/ me) Accesso: 2016-10-08 15:15:39.000000000 -0400
Modify: 2016-10-08 15:15:39.000000000 -0400
Change: 2016-10-08 15:15:39.000000000 -0400
[io@linuxbox~]$ parco giochi statistico/timestamp
File: `playground/timestamp'
Dimensione: 0 Blocchi: 0 Blocco IO: 4096 file vuoto normale Dispositivo: 803h/2051d Inode: 14265061 Collegamenti: 1
Accesso: (0644/-rw-r--r--) Uid: ( 1001/ me) Gid: ( 1001/ me) Accesso: 2016-10-08 15:15:39.000000000 -0400
Modify: 2016-10-08 15:15:39.000000000 -0400
Change: 2016-10-08 15:15:39.000000000 -0400
Se ci toccare nuovamente il file e poi esaminarlo con stat, vedremo che gli orari del file sono stati aggiornati.:
[io@linuxbox~]$ area giochi touch/timestamp
[io@linuxbox~]$ parco giochi statistico/timestamp
File: `playground/timestamp'
Dimensione: 0 Blocchi: 0 Blocco IO: 4096 file vuoto normale Dispositivo: 803h/2051d Inode: 14265061 Collegamenti: 1
Accesso: (0644/-rw-r--r--) Uid: ( 1001/ me) Gid: ( 1001/ me) Accesso: 2016-10-08 15:23:33.000000000 -0400
Modify: 2016-10-08 15:23:33.000000000 -0400
Change: 2016-10-08 15:23:33.000000000 -0400
[io@linuxbox~]$ area giochi touch/timestamp
[io@linuxbox~]$ parco giochi statistico/timestamp
File: `playground/timestamp'
Dimensione: 0 Blocchi: 0 Blocco IO: 4096 file vuoto normale Dispositivo: 803h/2051d Inode: 14265061 Collegamenti: 1
Accesso: (0644/-rw-r--r--) Uid: ( 1001/ me) Gid: ( 1001/ me) Accesso: 2016-10-08 15:23:33.000000000 -0400
Modify: 2016-10-08 15:23:33.000000000 -0400
Change: 2016-10-08 15:23:33.000000000 -0400
Ora, usiamo Find per aggiornare alcuni dei nostri file di gioco:
[io@linuxbox~]$ trova playground -tipo f -nome 'file-B' -exec touch '{}' ';'
[io@linuxbox~]$ trova playground -tipo f -nome 'file-B' -exec touch '{}' ';'
Questo aggiorna tutti i file nel playground denominato file-B. Successivamente useremo Find per identificare i file aggiornati confrontando tutti i file con il file di riferimento timestamp:
[io@linuxbox~]$ trova parco giochi -tipo f -parco giochi più recente/timestamp
[io@linuxbox~]$ trova parco giochi -tipo f -parco giochi più recente/timestamp
I risultati contengono tutte le 100 istanze di file-B. Poiché abbiamo eseguito un toccare su tutti i file nel playground denominato file-B dopo aver aggiornato timestamp, ora sono "più nuovi" di timestamp e quindi può essere identificato con il -più nuovo test.
Infine, torniamo al test dei permessi errati che abbiamo eseguito in precedenza e applichiamolo a
[io@linuxbox~]$ trova playground \( -tipo f -non -perm 0600 \) -oppure \(
-tipo d -non -perm 0700 \)
[io@linuxbox~]$ trova playground \( -tipo f -non -perm 0600 \) -oppure \(
-tipo d -non -perm 0700 \)
Questo comando elenca tutte le 100 directory e i 2600 file in parco giochi (così come timestamp e parco giochi stesso, per un totale di 2702) perché nessuno di essi soddisfa la nostra definizione di "buoni permessi". Grazie alla nostra conoscenza di operatori e azioni, possiamo aggiungere azioni a questo comando per applicare nuovi permessi ai file e alle directory nel nostro ambiente di gioco:
[io@linuxbox~]$ trova playground \( -type f -not -perm 0600 -exec chmod 0600 '{}' ';' \) -oppure \( -type d -not -perm 0700 -exec chmod 0700 '{}' ';' \)
[io@linuxbox~]$ trova playground \( -type f -not -perm 0600 -exec chmod 0600 '{}' ';' \) -oppure \( -type d -not -perm 0700 -exec chmod 0700 '{}' ';' \)
Nella vita di tutti i giorni, potremmo trovare più semplice impartire due comandi, uno per le directory e uno per i file, anziché un unico comando composto, ma è bello sapere che possiamo farlo in questo modo. Il punto importante qui è capire come gli operatori e le azioni possono essere utilizzati insieme per eseguire attività utili.