Com manipular noms de fitxer amb espais i caràcters especials a Linux


Ens trobem amb noms de fitxers i carpetes amb molta regularitat. En la majoria dels casos, el nom del fitxer/carpeta està relacionat amb el contingut del fitxer/carpeta i comença amb un número i caràcters. Els noms de fitxer alfanumèrics són bastant comuns i molt utilitzats, però aquest no és el cas quan hem de tractar amb el nom de fitxer/carpeta que conté caràcters especials.

Nota: Podem tenir fitxers de qualsevol tipus, però per senzillesa i fàcil implementació tractarem el fitxer de text (.txt), al llarg de l'article.

Un exemple dels noms de fitxer més comuns són:

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

Un exemple de noms de fitxer numèrics són:

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

Un exemple de noms de fitxers alfanumèrics són:

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

Exemples de noms de fitxers que tenen caràcters especials i no són molt habituals:

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

Una de les preguntes més òbvies aquí és: qui diable crea/s'encarrega d'un nom de fitxers/carpetes amb un hash (#), un punt i coma (;), un guió (-) o qualsevol altre caràcter especial.

Estic d'acord amb vostè, que aquests noms de fitxers no són comuns, encara que el vostre shell no s'hauria de trencar/abandonar quan hàgiu de tractar amb aquests noms de fitxer. També parlant tècnicament, tot, ja sigui carpeta, controlador o qualsevol altra cosa, es tracta com a fitxer a Linux.

Tractar amb un fitxer que té guió (-) al seu nom

Creeu un fitxer que comenci amb un guió (-), per exemple -abx.txt.

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

El motiu de l'error anterior, aquest intèrpret d'ordres interpreta qualsevol cosa després d'un guió (-), com a opció, i òbviament no hi ha aquesta opció, per tant és l'error.

Per resoldre aquest error, hem de dir a l'intèrpret d'ordres de Bash (sí, aquest i la majoria dels altres exemples de l'article són per a BASH) que no interpreti res després del caràcter especial (aquí guió), com a opció.

Hi ha dues maneres de resoldre aquest error com:

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

Podeu verificar el fitxer així creat per les dues maneres anteriors executant les ordres ls o ls -l per a una llista llarga.

$ ls -l

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

Per editar el fitxer anterior podeu fer:

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

Nota: podeu substituir nano per qualsevol altre editor que trieu, digueu vim com:

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

De la mateixa manera, per moure aquest fitxer, heu de fer:

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

i per esborrar aquest fitxer, heu de fer:

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

Si teniu molts fitxers en una carpeta el nom de la qual conté un guió i voleu suprimir-los tots alhora, feu el següent:

$ rm ./-*

1. Segueix la mateixa regla que s'ha comentat anteriorment per a qualsevol nombre de guió en el nom del fitxer i la seva aparició. És a dir, -a-b-c.txt, ab-c.txt, abc-.txt, etc.

2. Segueix la mateixa regla que s'ha comentat anteriorment per al nom de la carpeta que té qualsevol nombre de guió i la seva aparició, excepte el fet que per eliminar la carpeta heu d'utilitzar rm -rf com:

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

Tractar fitxers amb HASH (#) al nom

El símbol # té un significat molt diferent a BASH. Qualsevol cosa després d'un # s'interpreta com a comentari i, per tant, BASH ho ignora.

crear un fitxer #abc.txt.

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

El motiu de l'error anterior és que Bash interpreta #abc.txt un comentari i, per tant, ignora. Per tant, l'ordre touch s'ha passat sense cap operand de fitxer i, per tant, és l'error.

Per resoldre aquest error, podeu demanar a BASH que no interpreti # com a comentari.

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

i verifiqueu el fitxer acabat de crear com:

$ ls -l

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

Ara creeu un fitxer el nom del qual contingui # en qualsevol lloc excepte a la petició.

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

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

Executeu ls -l per verificar-ho:

$ 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

Què passa quan creeu dos fitxers (per exemple, a i #bc) alhora:

$ touch a.txt #bc.txt

Verifiqueu el fitxer acabat de crear:

$ ls -l

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

Òbviament, a partir de l'exemple anterior, només ha creat el fitxer 'a' i el fitxer '#bc' s'ha ignorat. Per executar la situació anterior amb èxit, podem fer,

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

i verificar-ho com:

$ 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

Podeu moure el fitxer com:

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

Copia-ho com a:

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

Podeu editar-lo fent servir l'editor que trieu com a:

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

I esborra-ho com a:

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

Per suprimir tots els fitxers que tenen hash (#) al nom del fitxer, podeu utilitzar:

 # rm ./#*

Tractar fitxers amb punt i coma (;) al seu nom

En cas que no ho sabeu, el punt i coma actua com a separador d'ordres a BASH i potser també a un altre shell. El punt i coma us permet executar diverses ordres d'una vegada i actua com a separador. Alguna vegada has tractat amb algun nom de fitxer amb punt i coma? Si no aquí ho faràs.

Creeu un fitxer amb punt i coma.

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

La raó de l'error anterior és que quan executeu l'ordre anterior BASH interpreteu el toc com una ordre, però no s'ha pogut trobar cap operand de fitxer abans del punt i coma i, per tant, informa d'un error. També informa d'un altre error que l'ordre 'abc.txt' no s'ha trobat, només perquè després del punt i coma BASH esperava una altra ordre i 'abc.txt', no és una ordre.

Per resoldre aquest error, digueu a BASH que no interpreti el punt i coma com a separador d'ordres, com:

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

Nota: hem inclòs el nom del fitxer amb cometes simples . Li diu a BASH que ; és una part del nom del fitxer i no un separador d'ordres.

La resta de l'acció (és a dir, copiar, moure, suprimir) al fitxer i la carpeta amb punt i coma en el seu nom es pot dur a terme directament posant el nom entre cometes simples.

Tractar amb altres caràcters especials al nom del fitxer/carpeta

No requereix res addicional, només cal fer-ho de manera normal, amb un nom de fitxer senzill com es mostra a continuació.

$ touch +12.txt 

Heu d'adjuntar el nom del fitxer entre cometes simples, com vam fer en el cas del punt i coma. La resta de coses són senzilles..

$ touch '$12.txt'

No cal que feu res diferent, tracteu-lo com un fitxer normal.

$ touch %12.txt

Tenir Asterisk al nom del fitxer no canvia res i podeu continuar utilitzant-lo com a fitxer normal.

$ touch *12.txt

Nota: Quan hàgiu de suprimir un fitxer que comenci per *, no feu servir mai les ordres següents per suprimir aquests fitxers.

$ rm *
or
$ rm -rf *

En lloc d'utilitzar,

$ rm ./*.txt

Simplement afegiu el nom del fitxer entre cometes simples i la resta de coses són iguals.

$ touch '!12.txt'

Res addicional, tracteu un nom de fitxer amb At Sign com a fitxer no normal.

$ touch '@12.txt'

No cal atenció addicional. Utilitzeu un fitxer que tingui ^ al nom del fitxer com a fitxer normal.

$ touch ^12.txt

El nom del fitxer s'ha d'adjuntar entre cometes simples i ja esteu preparat.

$ touch '&12.txt'

Si el nom del fitxer té parèntesis, heu d'incloure el nom del fitxer amb cometes simples.

$ touch '(12.txt)'

No cal cura addicional. Només cal tractar-lo com un fitxer més.

$ touch {12.txt}

Un nom de fitxer amb chevrons s'ha d'incloure entre cometes simples.

$ touch '<12.txt>'

Tracteu el nom del fitxer amb claudàtors com a fitxers normals i no cal que tingueu cura d'ell.

$ touch [12.txt]

Són molt habituals i no requereixen res addicional. Feu el que hauríeu fet amb un fitxer normal.

$ touch _12.txt

Tenir un signe d'Igual a no canvia res, podeu utilitzar-lo com a fitxer normal.

$ touch =12.txt

La barra invertida diu a shell que ignori el caràcter següent. Heu d'adjuntar el nom del fitxer entre cometes simples, com vam fer en el cas del punt i coma. La resta de coses són senzilles.

$ touch '.txt'

No podeu crear un fitxer el nom del qual inclogui una barra inclinada (/) fins que el vostre sistema de fitxers tingui errors. No hi ha manera d'escapar d'una barra inclinada cap endavant.

Per tant, si podeu crear un fitxer com /12.txt o b/c.txt, el vostre sistema de fitxers té un error o teniu suport Unicode, que us permet crear un fitxer amb barra inclinada. En aquest cas, la barra inclinada no és una barra inclinada real sinó un caràcter Unicode que s'assembla a una barra inclinada.

De nou, un exemple on no cal fer cap intent especial. Un nom de fitxer amb signe d'interrogació es pot tractar de la manera més general.

$ touch ?12.txt

Els fitxers que comencen amb punt (.) són molt especials a Linux i s'anomenen fitxers de punts. Són fitxers ocults generalment una configuració o fitxers del sistema. Heu d'utilitzar el commutador -a o -A amb l'ordre ls per veure aquests fitxers.

La creació, l'edició, el canvi de nom i la supressió d'aquests fitxers són senzills.

$ touch .12.txt

Nota: A Linux podeu tenir tants punts (.) com necessiteu en un nom de fitxer. A diferència d'altres punts del sistema al nom del fitxer, no vol dir separar el nom i l'extensió. Podeu crear un fitxer amb diversos punts com:

$ touch 1.2.3.4.5.6.7.8.9.10.txt

i comproveu-ho com:

$ 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

Podeu tenir comes en un nom de fitxer, tants com vulgueu i no necessiteu res addicional. Feu-ho de manera normal, com a simple nom de fitxer.

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

Podeu tenir dos punts en un nom de fitxer, tants com vulgueu i no necessiteu res addicional. Feu-ho de manera normal, com a simple nom de fitxer.

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

Per tenir cometes al nom del fitxer, hem d'utilitzar la regla d'intercanvi. És a dir, si cal que hi hagi cometes simples al nom del fitxer, afegiu el nom del fitxer amb cometes dobles i si necessiteu que hi hagi cometes dobles al nom del fitxer, afegiu-les amb cometes simples.

$ touch "15'.txt"

and

$ touch '15”.txt'

Alguns editors de Linux com emacs creen un fitxer de còpia de seguretat del fitxer que s'està editant. El fitxer de còpia de seguretat té el nom del fitxer original més una tilde al final del nom del fitxer. Podeu tenir un fitxer el nom del qual inclogui tilde, en qualsevol ubicació simplement com:

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

Creeu un fitxer el nom del qual tingui espai entre caràcter/paraula, digueu \hola, em dic avishek.txt.

No és una bona idea tenir un nom de fitxer amb espais i si heu de distingir un nom llegible, hauríeu d'utilitzar, subratllat o guió. Tanmateix, si heu de crear un fitxer d'aquest tipus, heu d'utilitzar la barra inclinada endarrera que ignora el caràcter següent. Per crear el fitxer anterior hem de fer-ho d'aquesta manera..

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

hi my name is avishek.txt

He intentat cobrir tots els escenaris que puguis trobar. La majoria de la implementació anterior és explícitament per a BASH Shell i és possible que no funcioni en un altre shell.

Si creieu que em vaig perdre alguna cosa (que és molt comú i de naturalesa humana), podeu incloure el vostre suggeriment als comentaris a continuació. Mantingueu-vos connectats, continueu comentant. Estigueu atents i connectats! Fes m'agrada i comparteix-nos i ajuda'ns a difondre'ns!