Come gestire gli spazi nei nomi dei file su Linux

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 touchper creare un nuovo file chiamato “il mio nuovo file.txt”.

touch my new file.txt ls

Tentativo di utilizzare il tocco per creare un file con spazi nel nome

Come possiamo vedere, lsci mostra che sono stati creati tre file, uno chiamato “mio”, un altro chiamato “nuovo” e un altro chiamato “file.txt”.

Nota che touchnon 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, touchsappi che è necessario trattare il testo citato come un unico argomento.

touch 'my new file.txt' ls

Utilizzo del tocco per creare un file con spazi nel nome, con l'intero nome del file racchiuso tra virgolette

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

Utilizzando il tocco per creare un file con spazi nel nome, è possibile eseguire l'escape con barre rovesciate

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

Utilizzo degli spazi di escape in un comando per copiare un file da una directory a un'altra

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 rmcomando e sappiamo che il nome della directory inizia con “dir”.

rm dir

Digitando l'inizio di un comando, prima di premere Tab per utilizzare il completamento tramite tabulazione

Premendo il tasto “Tab” Bash cerca le corrispondenze nella directory corrente.

Premendo Tab è stata aggiunta una barra rovesciata e uno spazio al percorso parziale della directory

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.

Il percorso della directory dopo la digitazione

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'intero nome del file viene completato premendo

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

Utilizzando chmod per rendere eseguibile lo script

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

Esecuzione dello script files.sh con nomi di file che non contengono spazi

Sembra funzionare bene. Ma cambiamo i file nella directory con file che contengono spazi nei loro nomi.

./files.sh

Esecuzione dello script files.sh con nomi di file contenenti spazi

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 $filevariabile all’interno del forciclo.

#!/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

Lo script files.sh modificato gestisce correttamente i file con spazi nei nomi dei file

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 · · 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

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *