Manipolare i file e directory
A questo punto, siamo pronti per un vero lavoro! Questo capitolo introdurrà cinque dei comandi Linux più utilizzati. I seguenti comandi sono usati per manipolare entrambi file e directory:
-
cp Copia file e directory
-
mv Sposta / rinomina file e directory
-
mkdir Crea directory
-
rm Rimuovi file e directory
-
ln Crea collegamenti
Ora, per essere sinceri, alcune delle attività eseguite da questi comandi vengono eseguite più facilmente con un file manager grafico. Con un file manager, possiamo trascinare e rilasciare un file da una directory all’altra, tagliare e incollare file, eliminare file e così via. Quindi perché usare questi vecchi programmi da riga di comando? La risposta è potenza e flessibilità. Mentre è facile eseguire semplici manipolazioni di file con un file manager grafico, le attività più complicate possono essere più facili con i programmi da riga di comando.
Ad esempio, come possiamo copiare tutti i file HTML da una directory all’altra ma copiare solo i file che non esistono nella directory di destinazione o che sono più recenti delle versioni nella directory di destinazione? È piuttosto difficile con un file manager ma abbastanza facile con la riga di comando.
cp -u * .html destinazione
I caratteri jolly
Prima di iniziare a usare i nostri comandi, dobbiamo parlare di una funzione di shell che rende questi comandi così potenti. Poiché la shell utilizza così tanti nomi di file, fornisce caratteri speciali che consentono di specificare rapidamente gruppi di nomi di file. Questi caratteri speciali sono chiamati caratteri jolly. L’uso di caratteri jolly (noto anche come globbing) consente di selezionare i nomi dei file in base a modelli di caratteri.
La Tabella 4-1 elenca i caratteri jolly e ciò che selezionano.
Tabella 4-1:
Caratteri jolly Significato jolly
* Corrisponde a qualsiasi carattere
? Corrisponde a qualsiasi singolo carattere
[caratteri] Corrisponde a qualsiasi carattere membro dei caratteri impostati
[! characters] Corrisponde a qualsiasi carattere che non sia un membro dei carattere impostati
[[: class:]] Corrisponde a qualsiasi carattere membro della classe specificata
Tabella 4-2: Classi di caratteri comunemente usate
Classe di caratteri Significato
[: alnum:] Corrisponde a qualsiasi carattere alfanumerico
[: alpha:] Corrisponde a qualsiasi carattere alfabetico
[: digit:] Corrisponde a qualsiasi numero
[: lower:] Corrisponde a qualsiasi lettera minuscola
[: upper:] Corrisponde a qualsiasi lettera maiuscola
Collegamenti fisici a directory
Alcuni sistemi, tra cui GNU/Linux, vietano espressamente la creazione di collegamenti fisici a directory per motivi di sicurezza: potendoli creare è infatti possibile ottenere gerarchie nel file system che si autoincludono, e che possono quindi portare i programmi che esaminano il file system ricorsivamente (come ad esempio quelli che effettuano il backup) a discendere all’infinito nella gerarchia, di fatto impedendone l’utilizzo.
Altri sistemi permettono questa operazione solo al superuser (root)
Crea un collegamento fisico chiamato hardlink.txt al file file.txt:
ln file.txt hardlink.txt
I collegamenti reali sono il modo originale Unix di creare collegamenti, rispetto ai collegamenti simbolici, che sono più moderni.
Per impostazione predefinita, ogni file ha un singolo collegamento reale che dà il nome al file.
Quando creiamo un collegamento reale, creiamo una voce di directory aggiuntiva per un file. I collegamenti fisici hanno due importanti limitazioni.
-
Un collegamento reale non può fare riferimento a un file esterno al proprio file system.
Questo indica che un collegamento non può fare riferimento a un file che non si trova sulla stessa partizione del disco del collegamento stesso.
-
Un collegamento reale potrebbe non fare riferimento a una directory.
Un collegamento reale non è distinguibile dal file stesso. A differenza di un collegamento simbolico, quando si elenca una directory contenente un collegamento reale, non verrà visualizzata alcuna indicazione speciale del collegamento. Quando viene eliminato un collegamento reale, il collegamento viene rimosso, ma il contenuto del file stesso continua a esistere (ovvero, il suo spazio non viene deallocato) fino a quando non vengono eliminati tutti i collegamenti al file. È importante essere consapevoli dei collegamenti concreti perché potresti incontrarli di volta in volta, ma la pratica moderna preferisce i collegamenti simbolici, che tratteremo in seguito.
Collegamenti simbolici
I collegamenti simbolici sono stati creati per superare i limiti dei collegamenti fisici.
Funzionano creando un tipo speciale di file che contiene un puntatore di testo al file o alla directory di riferimento.
A questo proposito, funzionano più o meno allo stesso modo di un collegamento di Windows, anche se ovviamente precedono
la funzionalità di Windows da molti anni. Un file a cui punta un collegamento simbolico e il collegamento simbolico stesso sono in gran parte indistinguibili l’uno dall’altro. Ad esempio, se si scrive qualcosa sul collegamento simbolico, viene scritto il file di riferimento. Quando si elimina un collegamento simbolico, tuttavia, viene eliminato solo il collegamento, non il file stesso.
Se il file viene eliminato prima del collegamento simbolico, il collegamento continuerà a esistere ma non indicherà nulla. In questo caso, si dice che il collegamento non funziona. In molte implementazioni, il comando ls mostrerà i collegamenti interrotti in un colore distintivo, come il rosso, per rivelare la loro presenza.
Esempio
Crea un collegamento simbolico chiamato softlink.txt al file file.txt:
ln -s file.txt softlink.txt
Crea un collegamento fisico chiamato hardlink.txt al file file.txt:
ln file.txt hardlink.txt
Creazione di directory
Il comando mkdir viene utilizzato per creare una directory. Per creare la nostra directory del parco giochi, ci assicureremo prima di essere nella nostra home directory e quindi creeremo la nuova directory.
[me @ linuxbox ~] $ cd
[me @ linuxbox ~] $ mkdir playground
Per rendere il nostro parco giochi un po ‘più interessante, creiamo un paio di directory al suo interno chiamate dir1 e dir2. Per fare ciò, cambieremo la nostra attuale directory di lavoro in un parco giochi ed eseguiremo un altro mkdir.
[me @ linuxbox ~] $ cd playground
[me @ linuxbox playground] $ mkdir dir1 dir2
Si noti che il comando mkdir accetterà più argomenti che consentono di creare entrambe le directory con un singolo comando.
Copia dei file
Quindi, portiamo alcuni dati nel nostro parco giochi (playground). Lo faremo copiando un file. Usando il comando cp, copieremo il file passwd dalla directory / etc nella directory di lavoro corrente.
[[email protected] playground]$ cp /etc/passwd
Nota come abbiamo usato la scorciatoia per l’attuale directory di lavoro, il singolo periodo finale. Quindi ora se eseguiamo un ls, vedremo il nostro file.
[[email protected] playground]$ ls -l
total 12
drwxrwxr-x 2 me me 4096 2018-01-10 16:40 dir1
drwxrwxr-x 2 me me 4096 2018-01-10 16:40 dir2
-rw-r–r– 1 me me 1650 2018-01-10 16:07 passwd
Ora, solo per divertimento, ripetiamo la copia usando l’opzione -v (dettaglio) per vedere cosa succede.
[me @ linuxbox playground] $ cp -v / etc / passwd.
`/ etc / passwd ‘->` ./passwd’
Il comando cp ha eseguito nuovamente la copia ma questa volta ha visualizzato un messaggio conciso che indica quale operazione stava eseguendo.
Si noti che cp ha sovrascritto la prima copia senza alcun preavviso.
Ancora una volta, questo è un caso di cp supponendo che sappiamo cosa stiamo facendo.
Per ricevere un avviso, includeremo l’opzione -i (interattiva).
[[email protected] playground]$ cp -i /etc/passwd .
cp: overwrite `./passwd’?
Rispondere al prompt immettendo una y provocherà la sovrascrittura del file; qualsiasi altro carattere (ad esempio, n) farà sì che cp lasci il file da solo.
Spostamento e ridenominazione dei file
Ora, il nome passwd non sembra molto giocoso e se questo è un parco giochi, cambiamolo in qualcos’altro.
[me @ linuxbox playground] $ mv passwd fun
Passiamo un po ‘il “fun” spostando il nostro file rinominato in ciascuna directory e viceversa.
Quanto segue lo sposta prima nella directory
dir1:
[me @ linuxbox playground] $ mv fun dir1
Quindi lo sposta da dir1 a dir2:
[me @ linuxbox playground] $ mv dir1 / fun dir2
Manipolazione di file e directory
Infine, questo comando lo riporta alla directory di lavoro corrente:
[me @ linuxbox playground] $ mv dir2 / fun.
Quindi, vediamo l’effetto di mv sulle directory.
Innanzitutto trasferiremo i nostri dati file di nuovo in dir1, in questo modo:
[me @ linuxbox playground] $ mv fun dir1
Quindi spostiamo dir1 in dir2 e lo confermiamo con ls.
[me @ linuxbox playground] $ mv dir1 dir2
[me @ linuxbox playground] $ ls -l dir2
totale 4
drwxrwxr-x 2 me me 4096 2018-01-11 06:06 dir1
[me @ linuxbox playground] $ ls -l dir2 / dir1
totale 4
-rw-r – r– 1 me me 1650 2018-01-10 16:33 fun
Si noti che poiché dir2 esisteva già, mv ha spostato dir1 in dir2. Se dir2 non fosse esistito, mv avrebbe rinominato dir1 in dir2.
Infine, rimettiamo tutto.
[me @ linuxbox playground] $ mv dir2 / dir1.
[me @ linuxbox playground] $ mv dir1 / fun.
Creazione di collegamenti reali
Ora proveremo alcuni link. Per prima cosa creeremo alcuni collegamenti reali al nostro file di dati, in questo modo:
[me @ linuxbox playground] $ ln divertimento divertente
[me @ linuxbox playground] $ ln fun dir1 / fun-hard
[me @ linuxbox playground] $ ln fun dir2 / fun-hard
Quindi ora abbiamo quattro istanze del file divertente. Diamo un’occhiata al nostro
directory del parco giochi.
[me @ linuxbox playground] $ ls -l
totale 16
drwxrwxr-x 2 me me 4096 2018-01-14 16:17 dir1
drwxrwxr-x 2 me me 4096 2018-01-14 16:17 dir2
-rw-r – r– 4 me me 1650 2018-01-10 16:33 fun
-rw-r – r– 4 me me 1650 2018-01-10 16:33 fun-hard
Una cosa che notiamo è che entrambi i secondi campi negli elenchi per divertimento e divertimento contengono un 4, che è il numero di collegamenti reali che esistono ora per il file. Ricorda che un file avrà sempre almeno un collegamento perché il nome del file viene creato da un collegamento.
Quindi, come facciamo a sapere che divertimento e divertimento sono, in effetti, lo stesso file?
In questo caso, ls non è molto utile.
Mentre possiamo vedere che divertimento e divertimento sono entrambi della stessa dimensione (campo 5), il nostro elenco non fornisce alcun modo per essere sicuri. Per risolvere questo problema, dovremo scavare un po ‘più a fondo. Quando si pensa ai collegamenti reali, è utile immaginare che i file siano composti da due parti.
-
La parte di dati contenente i contenuti del file
-
La parte del nome che contiene il nome del file
Quando creiamo collegamenti reali, in realtà stiamo creando parti di nome aggiuntive che fanno tutti riferimento alla stessa parte di dati. Il sistema assegna una catena di blocchi del disco a quello che viene chiamato un inode, che viene quindi associato alla parte del nome. Ogni hard link si riferisce quindi a un inode specifico contenente il contenuto del file. Il comando ls ha un modo per rivelare queste informazioni. Viene richiamato con l’opzione -i.
[me @ linuxbox playground] $ ls -li
totale 16
12353539 drwxrwxr-x 2 me me 4096 2018-01-14 16:17 dir1
12353540 drwxrwxr-x 2 me me 4096 2018-01-14 16:17 dir2
12353538 -rw-r – r– 4 me me 1650 2018-01-10 16:33 fun
12353538 -rw-r – r– 4 me me 1650 2018-01-10 16:33 fun-hard
In questa versione dell’elenco, il primo campo è il numero di inode e, come possiamo vedere, sia divertente che divertente condividere lo stesso numero di inode, il che conferma che sono lo stesso file.
Creazione di collegamenti simbolici
I collegamenti simbolici sono stati creati per superare i due svantaggi dei collegamenti reali:
-
I collegamenti fisici non possono estendersi ai dispositivi fisici.
-
I collegamenti reali non possono fare riferimento alle directory, ma solo ai file.