Come gestire gli spazi nei nomi dei file su Linux
Punti chiave
Se hai un nome file con spazi su un sistema Linux, racchiudere il nome file tra virgolette consente a Bash di trattarlo correttamente. Il completamento tramite tabulazione semplifica l’immissione dei nomi dei file sulla riga di comando, anche se contengono spazi.
Come la maggior parte dei sistemi operativi, Linux supporta nomi di file con spazi al loro interno. Ma usare questi nomi di file sulla riga di comando non è sempre semplice. Ecco diversi modi in cui puoi gestire i nomi di file contenenti spazi.
Come funzionano i nomi dei file Linux?
Tutto ciò che è archiviato sul disco rigido del tuo computer deve avere un nome. Senza un nome, non esisterebbero file. Tutte le applicazioni e i demoni che vengono avviati all’avvio del computer e tutto il software che utilizzi devono essere identificati e archiviati in un file system. Questa identificazione è il nome del file.”
La stessa cosa vale per i file che crei o installi. Tutti i tuoi documenti, immagini e musica necessitano di nomi di file. Senza nomi di file, nessuna delle tue risorse digitali potrebbe esistere. Poiché i nomi dei file sono così importanti, Linux si sforza di imporre quante meno regole possibile sulla loro composizione.
Su Linux, un nome file può contenere qualsiasi carattere tranne la barra “/” e il carattere null, 0x00. Il carattere null viene utilizzato per contrassegnare la fine di una stringa, quindi non può essere presente nella stringa stessa, altrimenti Linux troncerebbe il nome del file nella posizione del carattere null. La barra “/” viene utilizzata come separatore nei percorsi delle directory.
I nomi dei file fanno distinzione tra maiuscole e minuscole e possono essere lunghi fino a 255 byte , incluso il carattere null. I percorsi delle directory possono essere lunghi fino a 4096 byte, incluso il carattere null. Tieni presente che questa è la loro lunghezza in byte, che potrebbe non equivalere direttamente ai caratteri. I caratteri Unicode a 16 bit, ad esempio, occupano due byte ciascuno.
Gli appassionati di retro-computing e quelli con la memoria lunga sapranno che agli albori dei personal computer, il sistema operativo disco di Microsoft , DOS, non faceva distinzione tra maiuscole e minuscole e aveva un limite di nome file di otto caratteri, più un’estensione di tre caratteri .
Dovevi essere molto premuroso e talvolta creativo quando davi un nome ai file. In confronto, la libertà che abbiamo oggi significa che possiamo nominare i file come vogliamo, senza pensare a nulla di diverso dalla descrizione che stiamo creando per quel file.
Ma con i nomi dei file, ciò che ci fa inciampare più spesso non sono i caratteri che digitiamo, ma gli spazi tra di loro.
Perché gli spazi nei nomi dei file Linux sono una seccatura
Shell come Bash interpreteranno una stringa di parole separate da spazi come argomenti di comando individuali, non un singolo argomento. Ecco un esempio, utilizzando touch
per creare un nuovo file chiamato “il mio nuovo file.txt”.
touch my new file.txt
ls
Come possiamo vedere, ls
ci mostra che sono stati creati tre file, uno chiamato “mio”, un altro chiamato “nuovo” e un altro chiamato “file.txt”.
Nota che touch
non si è lamentato né ha generato un errore. Esegue ciò che pensa che gli stiamo chiedendo di fare. Quindi ci riporta silenziosamente alla riga di comando. Se non siamo motivati a verificare, non sapremo che le cose non sono andate secondo i piani.
Per creare il file che volevamo, dobbiamo citare o scappare.
Come citare e sfuggire agli spazi
Se citiamo l’intero nome del file, touch
sappi che è necessario trattare il testo citato come un unico argomento.
touch 'my new file.txt'
ls
Questa volta otteniamo il singolo file che ci aspettiamo.
Possiamo ottenere lo stesso risultato se usiamo il carattere barra rovesciata “ \
“per sfuggire agli spazi. Facendo “escape” agli spazi, questi non vengono trattati come caratteri speciali, ovvero come separatori di argomenti, ma sono considerati semplici vecchi spazi.
touch my\ second\ new\ file.txt
ls
Funziona, ma l’escape degli spazi rende la digitazione dei nomi dei file più lenta e soggetta a errori. Le cose possono diventare davvero brutte se hai nomi di directory che contengono anche spazi.
cp dir one/my\ text\ file.txt dir\ two/my\ text file.bak
ls
Quel comando copia un singolo file di testo da una directory chiamata “dir one” a una directory chiamata “dir two” e salva la copia come file BAK. Ed è un esempio abbastanza semplice.
Come risolvere il problema dello spazio alla fonte
Se sono file di tua proprietà, potresti prendere la decisione politica di non utilizzare mai gli spazi e creare (o rinominare in blocco ) nomi di file come questo.
mynewtextfile.txt
Certo, è una soluzione robusta ma è comunque brutta. Ci sono opzioni migliori, come usare i trattini “ -
“o i caratteri di sottolineatura “ _
“per separare le parole.
my-new-text-file.txt
my_new_text_file.txt
Entrambi eluderanno il problema e sono leggibili. Se non vuoi aggiungere caratteri extra ai nomi dei file, puoi utilizzare CamelCase per rendere leggibili i nomi dei file, in questo modo:
MyNewTextFile.txt
L’espansione delle schede semplifica la gestione degli spazi
Naturalmente, adottare una convenzione di denominazione e rispettarla sarà utile solo quando hai a che fare con i tuoi file. È improbabile che i file provenienti da qualsiasi altra parte seguano la convenzione di denominazione adottata.
Puoi utilizzare l’espansione delle tabulazioni per aiutarti a “compilare” con precisione i nomi dei file per noi. Diciamo che vogliamo eliminare il file BAK che abbiamo creato nella “dir due”, utilizzando rm
.
Iniziamo digitando “rm dir” perché stiamo utilizzando il rm
comando e sappiamo che il nome della directory inizia con “dir”.
rm dir
Premendo il tasto “Tab” Bash cerca le corrispondenze nella directory corrente.
Ci sono due directory che iniziano con “dir”, e in entrambi i casi il carattere successivo è uno spazio. Quindi Bash aggiunge il carattere barra rovesciata “ \
“e uno spazio. Bash quindi aspetta che forniamo il carattere successivo. È necessario il carattere successivo per distinguere tra le due possibili corrispondenze in questa directory.
Digiteremo una “t”, per “due”, quindi premeremo “Tab” ancora una volta.
Bash completa per noi il nome della directory e attende che digitiamo l’inizio del nome del file.
Abbiamo solo un file in questa directory, quindi digitare la prima lettera del nome del file, “m”, è sufficiente per far sapere a Bash quale file vogliamo utilizzare. Digitando “m” e premendo “Tab” si completa il nome del file e “Invio” esegue l’intero comando.
L’espansione delle schede semplifica la garanzia di ottenere i nomi dei file corretti e accelera anche la navigazione e la digitazione sulla riga di comando in generale.
Come utilizzare i nomi dei file con spazi negli script Bash
Non sorprende che gli script abbiano esattamente gli stessi problemi con gli spazi nei nomi dei file della riga di comando. Se stai passando un nome file come variabile assicurati di citare il nome della variabile.
Questo piccolo script controlla la directory corrente per i file che corrispondono al modello di file “*.txt” e li memorizza in una variabile chiamata file_list
. Un ciclo for viene utilizzato per eseguire una semplice azione su ciascuno di essi.
#!/bin/bashfile_list=*.txtfor file in $file_listdo ls -hl $filedone
Copia questo testo in un editor e salvalo in un file chiamato “files.sh”. Quindi usa il comando chmod per renderlo eseguibile.
chmod +x files.sh
Abbiamo alcuni file in questa directory. Uno ha un nome file semplice e gli altri due utilizzano caratteri di sottolineatura “ _
“o trattini “ -
“invece di spazi. Questo è ciò che vediamo quando eseguiamo lo script.
./files.sh
Sembra funzionare bene. Ma cambiamo i file nella directory con file che contengono spazi nei loro nomi.
./files.sh
Ogni parola in ciascun nome file viene gestita come se fosse un nome file a sé stante, quindi lo script fallisce. Ma tutto ciò che dobbiamo fare affinché lo script gestisca gli spazi nei nomi dei file è citare la $file
variabile all’interno del for
ciclo.
#!/bin/bashfile_list=*.txtfor file in $file_listdols -hl "$file"done
Notare che il simbolo del dollaro “ $
“è racchiuso tra virgolette. Abbiamo apportato questa modifica e l’abbiamo salvata nel file di script “files.sh”. Questa volta i nomi dei file vengono gestiti correttamente.
./files.sh
Distanziati, ma non traballanti
Evitare gli spazi nei nomi dei tuoi file ti porterà solo lontano. È inevitabile che incontri file provenienti da altre fonti con nomi che contengono spazi. Per fortuna, se hai bisogno di gestire quei file dalla riga di comando o negli script, ci sono modi semplici per farlo.
Comandi di Linux |
|
File |
tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · guarda · stringhe · digita · rinomina · zip · decomprimi · monta · umount · installa · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · converti · rclone · shred · srm · scp · gzip · chattr · taglia · trova · umask · wc · tr |
Processi |
alias · schermo · top · nice · renice · progresso · strace · systemd · tmux · chsh · cronologia · at · batch · gratuito · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · mignolo · lsof · vmstat · timeout · wall · sì · kill · sleep · sudo · su · time · groupadd · usermod · gruppi · lshw · shutdown · reboot · halt · poweroff · passwd · lscpu · crontab · data · bg · fg · pidof · nohup · pmap |
Rete |
netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw · arping · firewalld |
Lascia un commento