GNU/Linux >> Linux Esercitazione >  >> Linux

Come manipolare nomi di file con spazi e caratteri speciali in Linux

Ci imbattiamo in nomi di file e cartelle molto regolarmente. Nella maggior parte dei casi il nome del file/cartella è correlato al contenuto del file/cartella e inizia con numero e caratteri. I nomi di file alfanumerici sono piuttosto comuni e ampiamente utilizzati, ma questo non è il caso quando abbiamo a che fare con nomi di file/cartelle che contengono caratteri speciali.

Nota :Possiamo avere file di qualsiasi tipo ma per semplicità e facile implementazione ci occuperemo di File di testo (.txt ), in tutto l'articolo.

Esempi di nomi di file più comuni sono:

abc.txt
avi.txt
debian.txt
...

Esempi di nomi di file numerici sono:

121.txt
3221.txt
674659.txt
...

Esempi di nomi di file alfanumerici sono:

eg84235.txt
3kf43nl2.txt
2323ddw.txt
...

Esempi di nomi di file che hanno un carattere speciale e non sono molto comuni:

#232.txt
#bkf.txt
#bjsd3469.txt
#121nkfd.txt
-2232.txt
-fbjdew.txt
-gi32kj.txt
--321.txt
--bk34.txt
...

Una delle domande più ovvie qui è:chi diavolo crea/gestisce il nome di file/cartelle con un hash (#) , un punto e virgola (;) , un trattino (-) o qualsiasi altro carattere speciale.

Sono d'accordo con te, che tali nomi di file non sono comuni, tuttavia la tua shell non dovrebbe rompersi/arrendersi quando devi gestire tali nomi di file. Anche parlando tecnicamente ogni cosa, che si tratti di cartella, driver o qualsiasi altra cosa, viene trattata come file in Linux.

Gestire un file con un trattino (-) nel nome

Crea un file che inizi con un trattino (-) , ad esempio -abx.txt .

$ touch -abc.txt
Risultato campione
touch: invalid option -- 'b'
Try 'touch --help' for more information.

Il motivo dell'errore precedente, quella shell interpreta qualsiasi cosa dopo un trattino (-) , come opzione, e ovviamente non esiste tale opzione, quindi è l'errore.

Per risolvere tale errore, dobbiamo dire alla shell Bash (sì, questo e la maggior parte degli altri esempi nell'articolo sono per BASH ) per non interpretare nulla dopo un carattere speciale (qui trattino), come opzione.

Esistono due modi per risolvere questo errore come:

$ touch -- -abc.txt		[Option #1]
$ touch ./-abc.txt		[Option #2]

Puoi verificare il file così creato in entrambi i modi precedenti eseguendo i comandi ls o ls -l per un elenco lungo.

$ ls -l

total 0
-rw-r--r-- 1 avi avi 0 Jun  8 11:05 -abc.txt

Per modificare il file sopra puoi fare:

$ nano -- -abc.txt 
or 
$ nano ./-abc.txt 

Nota :puoi sostituire nano con qualsiasi altro editor di tua scelta dì vim come:

$ vim -- -abc.txt 
or 
$ vim ./-abc.txt 

Allo stesso modo per spostare tale file devi fare:

$ mv -- -abc.txt -a.txt
or
$ mv -- -a.txt -abc.txt

e per eliminare questo file, devi fare:

$ rm -- -abc.txt
or
$ rm ./-abc.txt 

Se hai molti file in una cartella il cui nome contiene trattino e vuoi eliminarli tutti in una volta, fai come:

$ rm ./-*
Importante da notare:

1. La stessa regola discussa sopra segue per qualsiasi numero di trattini nel nome del file e la loro occorrenza. Vale a dire, -a-b-c.txt , ab-c.txt , abc-.txt , ecc.

2. La stessa regola discussa sopra segue per il nome della cartella che ha un numero qualsiasi di trattini e la loro occorrenza, tranne per il fatto che per eliminare la cartella devi usare 'rm -rf ' come:

$ rm -rf -- -abc
or
$ rm -rf ./-abc

Gestire file con HASH (#) nel nome

Il simbolo # ha un significato molto diverso in BASH. Qualsiasi cosa dopo un # viene interpretato come commento e quindi trascurato da BASH.

Comprendilo usando esempi:

crea un file #abc.txt .

$ touch #abc.txt
Risultato campione
touch: missing file operand
Try 'touch --help' for more information.

Il motivo dell'errore precedente è che Bash sta interpretando #abc.txt un commento e quindi ignorando. Quindi il comando touch è stato passato senza alcun file Operando, e quindi è l'errore.

Per risolvere tale errore, puoi chiedere a BASH di non interpretare # come commento.

$ touch ./#abc.txt
or
$ touch '#abc.txt'

e verifica il file appena creato come:

$ ls -l

total 0
-rw-r--r-- 1 avi avi 0 Jun  8 12:14 #abc.txt

Ora crea un file il cui nome contiene # ovunque tranne che all'accattonaggio.

$ touch ./a#bc.txt
$ touch ./abc#.txt

or
$ touch 'a#bc.txt'
$ touch 'abc#.txt'

Esegui "ls -l ' per verificarlo:

$ ls -l

total 0
-rw-r--r-- 1 avi avi 0 Jun  8 12:16 a#bc.txt
-rw-r--r-- 1 avi avi 0 Jun  8 12:16 abc#.txt

Cosa succede quando crei due file (ad esempio a e #bc ) subito:

$ touch a.txt #bc.txt

Verifica il file appena creato:

$ ls -l

total 0
-rw-r--r-- 1 avi avi 0 Jun  8 12:18 a.txt

Ovvio dall'esempio sopra, ha creato solo il file 'a ' e file '#bc ' è stato ignorato. Per eseguire con successo la situazione di cui sopra possiamo farlo,

$ touch a.txt ./#bc.txt
or
$ touch a.txt '#bc.txt'

e verificalo come:

$ ls -l

total 0
-rw-r--r-- 1 avi avi 0 Jun  8 12:20 a.txt
-rw-r--r-- 1 avi avi 0 Jun  8 12:20 #bc.txt

Puoi spostare il file come:

$ mv ./#bc.txt ./#cd.txt
or
$ mv '#bc.txt' '#cd.txt'

Copialo come:

$ cp ./#cd.txt ./#de.txt
or
$ cp '#cd.txt' '#de.txt'

Puoi modificarlo utilizzando la tua scelta di editor come:

$ vi ./#cd.txt
or
$ vi '#cd.txt'
$ nano ./#cd.txt
or
$ nano '#cd.txt'

Ed eliminalo come:

$ rm ./#bc.txt 
or
$ rm '#bc.txt'

Per eliminare tutti i file con hash (# ) nel nome del file, puoi utilizzare:

 # rm ./#*

Gestire file con punto e virgola (;) nel nome

Nel caso non lo sapessi, il punto e virgola funge da separatore di comandi in BASH e forse anche in altre shell. Il punto e virgola ti consente di eseguire più comandi in una volta sola e funge da separatore. Hai mai avuto a che fare con nomi di file con punto e virgola? Altrimenti qui lo farai.

Crea un file con punto e virgola.

$ touch ;abc.txt
Risultato campione
touch: missing file operand
Try 'touch --help' for more information.
bash: abc.txt: command not found

Il motivo dell'errore precedente è che quando esegui il comando precedente BASH interpreta touch come comando ma non è stato possibile trovare alcun operando di file prima del punto e virgola e quindi segnala un errore. Segnala anche un altro errore che "abc.txt ' comando non trovato, solo perché dopo il punto e virgola BASH si aspettava un altro comando e 'abc.txt ', non è un comando.

Per risolvere tale errore, di' a BASH di non interpretare il punto e virgola come separatore di comandi, come:

$ touch ./';abc.txt'
or
$ touch ';abc.txt'

Nota :Abbiamo racchiuso il nome del file tra virgolette singole '' . Dice a BASH che ; fa parte del nome del file e non del separatore di comandi.

Il resto dell'azione (vale a dire, copiare, spostare, eliminare) sul file e sulla cartella con punto e virgola nel nome può essere eseguita direttamente racchiudendo il nome tra virgolette singole.

Gestione di altri caratteri speciali nel nome di file/cartelle

Segno più (+) nel nome del file

Non richiede nulla in più, fallo normalmente, con un semplice nome di file come mostrato di seguito.

$ touch +12.txt 

Segno del dollaro ($) nel nome del file

Devi racchiudere il nome del file tra virgolette singole, come abbiamo fatto nel caso del punto e virgola. Il resto delle cose è semplice..

$ touch '$12.txt'

Percentuale (%) nel nome del file

Non devi fare nulla di diverso, trattalo come un file normale.

$ touch %12.txt

Asterisco (*) nel nome del file

Avere Asterisk nel nome del file non cambia nulla e puoi continuare a usarlo come file normale.

$ touch *12.txt

Nota :Quando devi eliminare un file che inizia con * , Non utilizzare mai i seguenti comandi per eliminare tali file.

$ rm *
or
$ rm -rf *

Invece usa,

$ rm ./*.txt

Punto esclamativo (!) nel nome del file

Racchiudi semplicemente il nome del file tra virgolette singole e il resto delle cose è lo stesso.

$ touch '!12.txt'

Al segno (@) nel nome del file

Niente in più, tratta un nome di file con At Sign come file non rmal.

$ touch '@12.txt'

^ nel nome del file

Nessuna ulteriore attenzione richiesta. Usa un file con ^ nel nome del file come file normale.

$ touch ^12.txt

E commerciale (&) nel nome del file

Il nome del file dovrebbe essere racchiuso tra virgolette singole e sei pronto per iniziare.

$ touch '&12.txt'

Tra parentesi () nel nome del file

Se il nome del file ha parentesi, è necessario racchiudere il nome del file tra virgolette singole.

$ touch '(12.txt)'

Parentesi graffe {} nel nome del file

Non sono necessarie cure extra. Consideralo solo come un altro file.

$ touch {12.txt}

Chevron <> nel nome del file

Un nome file con Chevron deve essere racchiuso tra virgolette singole.

$ touch '<12.txt>'

parentesi quadre [ ] nel nome del file

Tratta il nome del file con parentesi quadre come file normali e non devi prenderti cura di esso.

$ touch [12.txt]

Under punteggio (_) nel nome del file

Sono molto comuni e non richiedono nulla in più. Fai solo quello che avresti fatto con un file normale.

$ touch _12.txt

Uguale a (=) in Nome file

Avere un segno di uguale a non cambia nulla, puoi usarlo come un normale file.

$ touch =12.txt

Gestire la barra rovesciata (\)

La barra rovesciata dice alla shell di ignorare il carattere successivo. Devi racchiudere il nome del file tra virgolette singole, come abbiamo fatto nel caso del punto e virgola. Il resto delle cose è semplice.

$ touch '.txt'

Il caso speciale del taglio in avanti

Non puoi creare un file il cui nome includa una barra (/) , fino a quando il tuo file system non ha un bug. Non c'è modo di sfuggire a un taglio in avanti.

Quindi, se puoi creare un file come '/12.txt' o 'b/c.txt' quindi o il tuo file system ha un bug o hai il supporto Unicode, che ti consente di creare un file con una barra. In questo caso la barra non è una vera barra, ma un carattere Unicode che assomiglia a una barra.

Punto interrogativo (?) nel nome del file

Ancora una volta, un esempio in cui non è necessario fare alcun tentativo speciale. Un nome di file con punto interrogativo può essere trattato nel modo più generale.

$ touch ?12.txt

Segna punto (.) nel nome del file

I file che iniziano con il punto (.) sono molto speciali in Linux e sono chiamati file dot. Sono file nascosti generalmente una configurazione o file di sistema. Devi usare l'interruttore '-a ' o '-A ' con comando ls per visualizzare tali file.

La creazione, la modifica, la ridenominazione e l'eliminazione di tali file sono semplici.

$ touch .12.txt

Nota :In Linux potresti avere tanti punti (.) come necessario in un nome file. A differenza di altri punti di sistema nel nome del file non significa separare nome ed estensione. Puoi creare un file con più punti come:

$ touch 1.2.3.4.5.6.7.8.9.10.txt

e controllalo come:

$ ls -l

total 0
-rw-r--r-- 1 avi avi 0 Jun  8 14:32 1.2.3.4.5.6.7.8.9.10.txt

Virgola (,) nel nome del file

Puoi avere una virgola nel nome di un file, quante ne vuoi e non hai bisogno di nulla in più. Fallo in modo normale, come un semplice nome di file.

$ touch ,12.txt
or
$ touch ,12,.txt

Due punti (:) in Nome file

Puoi avere i due punti nel nome di un file, quanti ne vuoi e non hai bisogno di nulla in più. Fallo in modo normale, come un semplice nome di file.

$ touch :12.txt
or
$ touch :12:.txt

Avere virgolette (singole e doppie) nel nome del file

Per avere virgolette nel nome del file, dobbiamo usare la regola dello scambio. Cioè, se hai bisogno di virgolette singole nel nome del file, racchiudi il nome del file tra virgolette doppie e se hai bisogno di virgolette doppie nel nome del file, racchiudilo con virgolette singole.

$ touch "15'.txt"

and

$ touch '15”.txt'

Tilde (~) nel nome del file

Alcuni editor in Linux come emacs creare un file di backup del file in fase di modifica. Il file di backup ha il nome del file originale più una tilde alla fine del nome del file. Puoi avere un file il cui nome include tilde, in qualsiasi posizione semplicemente come:

$ touch ~1a.txt
or
$touch 2b~.txt

Spazio bianco nel nome del file

Crea un file il cui nome abbia uno spazio tra carattere/parola, dì "ciao, mi chiamo avishek.txt ”.

Non è una buona idea avere il nome del file con spazi e se devi distinguere un nome leggibile, dovresti usare, underscore o trattino. Tuttavia, se devi creare un file del genere, devi usare una barra all'indietro che ignora il carattere successivo. Per creare il file sopra dobbiamo farlo in questo modo..

$ touch hi\ my\ name\ is\ avishek.txt

hi my name is avishek.txt

Ho provato a coprire tutto lo scenario che potresti incontrare. La maggior parte delle implementazioni di cui sopra sono esplicitamente per BASH Shell e potrebbero non funzionare in altre shell.

Se ritieni che mi sia perso qualcosa (che è molto comune e di natura umana), puoi includere il tuo suggerimento nei commenti qui sotto. Resta connesso, continua a commentare. Resta sintonizzato e connesso! Metti mi piace e condividici e aiutaci a diffonderci!


Linux
  1. Come reindirizzare l'output su un file e Stdout in Linux

  2. Cos'è NFS e come installarlo su Linux

  3. Come estrarre i file .gz e .tar.gz in Linux

  4. Come prevenire la modifica, l'eliminazione e la ridenominazione di file/directory in Linux?

  5. Come vedo du in GB invece di MB in Linux?

Come lavorare con hardlink e softlink in Linux

Come rimuovere (^M) caratteri da un file in Linux

Come rimuovere gli spazi dai nomi dei file in Linux

Come creare e utilizzare file di scambio su Linux

Come affrontare i nomi dei file con gli spazi in Linux

Come rinominare tutti i file con caratteri speciali e spazi in una directory?