Comment manipuler les noms de fichiers ayant des espaces et des caractères spéciaux sous Linux


Nous rencontrons très régulièrement des noms de fichiers et de dossiers. Dans la plupart des cas, le nom du fichier/dossier est lié au contenu du fichier/dossier et commence par un nombre et des caractères. Les noms de fichier alphanumériques sont assez courants et très largement utilisés, mais ce n'est pas le cas lorsque nous devons traiter un nom de fichier/dossier contenant des caractères spéciaux.

Remarque: Nous pouvons avoir des fichiers de tout type mais pour plus de simplicité et de facilité de mise en œuvre, nous traiterons de fichier texte (.txt), tout au long de l'article.

Voici des exemples de noms de fichiers les plus courants:

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

Des exemples de noms de fichiers numériques sont:

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

Des exemples de noms de fichiers alphanumériques sont:

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

Exemples de noms de fichiers qui ont un caractère spécial et qui ne sont pas très courants:

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

L'une des questions les plus évidentes ici est: qui diable crée/gère les noms de fichiers/dossiers ayant un Hash (#) , un point-virgule (;) , un tiret (-) ou tout autre caractère spécial.

Je suis d'accord avec vous, que de tels noms de fichiers ne sont pas communs, mais votre shell ne doit pas se casser/abandonner lorsque vous devez traiter de tels noms de fichiers. Aussi, techniquement, tout ce qui est dossier, pilote ou autre est traité comme un fichier sous Linux.

Traiter un fichier dont le nom contient un tiret (-)

Créez un fichier commençant par un tiret (-) , par exemple -abx.txt.

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

La raison de l'erreur ci-dessus, ce shell interprète tout ce qui suit un tiret (-) , comme une option, et évidemment il n'y a pas une telle option, d'où l'erreur.

Pour résoudre une telle erreur, nous devons dire au shell Bash (ouais ceci et la plupart des autres exemples de l'article sont pour BASH) de ne rien interpréter après le caractère spécial (ici tiret), comme option.

Il existe deux façons de résoudre cette erreur:

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

Vous pouvez vérifier le fichier ainsi créé par les deux méthodes ci-dessus en exécutant les commandes ls ou ls -l pour une liste longue.

$ ls -l

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

Pour modifier le fichier ci-dessus, vous pouvez faire:

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

Remarque: vous pouvez remplacer nano par n'importe quel autre éditeur de votre choix, dites vim comme:

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

De même, pour déplacer un tel fichier, vous devez faire:

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

et pour supprimer ce fichier, vous devez faire:

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

Si vous avez beaucoup de fichiers dans un dossier dont le nom contient un tiret et que vous souhaitez tous les supprimer en même temps, procédez comme suit:

$ rm ./-*

1. La même règle que celle décrite ci-dessus suit pour tout nombre d'hypen dans le nom du fichier et leur occurrence. À savoir., -A-b-c.txt, ab-c.txt, abc-.txt, etc.

2. La même règle que celle décrite ci-dessus suit pour le nom du dossier ayant un nombre quelconque d’hypen et leur occurrence, sauf le fait que pour supprimer le dossier, vous devez utiliser «rm -rf» comme:

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

Traiter les fichiers ayant HASH (#) dans le nom

Le symbole # a une signification très différente en BASH. Tout ce qui suit un # est interprété comme un commentaire et donc négligé par BASH.

créez un fichier # abc.txt.

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

La raison de l'erreur ci-dessus, c'est que Bash interprète # abc.txt un commentaire et donc ignore. Ainsi, la commande touch a été passée sans aucun opérande de fichier, d'où l'erreur.

Pour résoudre une telle erreur, vous pouvez demander à BASH de ne pas interpréter # comme un commentaire.

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

et vérifiez le fichier que vous venez de créer comme:

$ ls -l

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

Créez maintenant un fichier dont le nom contient # n'importe où sauf à la mendicité.

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

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

Exécutez «ls -l» pour le vérifier:

$ 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

Que se passe-t-il lorsque vous créez deux fichiers (disons a et #bc) à la fois:

$ touch a.txt #bc.txt

Vérifiez le fichier que vous venez de créer:

$ ls -l

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

Évidemment, d'après l'exemple ci-dessus, seul le fichier «a» créé et le fichier «#bc» ont été ignorés. Pour exécuter la situation ci-dessus avec succès, nous pouvons faire,

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

et vérifiez-le comme:

$ 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

Vous pouvez déplacer le fichier comme:

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

Copiez-le comme:

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

Vous pouvez le modifier en utilisant votre choix d'éditeur comme:

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

Et supprimez-le comme:

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

Pour supprimer tous les fichiers dont le nom de fichier contient le hachage (#), vous pouvez utiliser:

 # rm ./#*

Traitement des fichiers dont le nom contient un point-virgule (;)

Au cas où vous ne le sauriez pas, le point-virgule agit comme un séparateur de commande dans BASH et peut-être aussi dans d'autres shell. Le point-virgule vous permet d'exécuter plusieurs commandes en une seule fois et agit comme séparateur. Avez-vous déjà eu affaire à un nom de fichier contenant un point-virgule? Sinon, vous le ferez.

Créez un fichier contenant un point-virgule.

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

La raison de l'erreur ci-dessus, que lorsque vous exécutez la commande ci-dessus, BASH interprète le toucher comme une commande mais n'a pas pu trouver d'opérande de fichier avant le point-virgule et, par conséquent, il signale une erreur. Il signale également une autre erreur que la commande ‘abc.txt’ n’a pas trouvé, uniquement parce qu’après le point-virgule, BASH attendait une autre commande et ‘abc.txt’ n’est pas une commande.

Pour résoudre une telle erreur, dites à BASH de ne pas interpréter le point-virgule comme séparateur de commande, comme suit:

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

Remarque: nous avons joint le nom du fichier avec un guillemet simple '' . Il indique à BASH que ; fait partie du nom de fichier et non du séparateur de commande.

Le reste de l'action (c'est-à-dire copier, déplacer, supprimer) sur le fichier et le dossier ayant un point-virgule dans son nom peut être effectué directement en plaçant le nom entre guillemets simples.

Traiter d'autres caractères spéciaux dans le nom du fichier / dossier

Ne nécessite rien de plus, faites-le simplement de manière normale, sous forme de nom de fichier simple comme indiqué ci-dessous.

$ touch +12.txt 

Vous devez mettre le nom du fichier entre guillemets simples, comme nous l'avons fait dans le cas du point-virgule. Le reste des choses est simple.

$ touch '$12.txt'

Vous n'avez rien à faire différemment, traitez-le comme un fichier normal.

$ touch %12.txt

Avoir Asterisk dans le nom de fichier ne change rien et vous pouvez continuer à l’utiliser comme un fichier normal.

$ touch *12.txt

Remarque: lorsque vous devez supprimer un fichier commençant par * , n'utilisez jamais les commandes suivantes pour supprimer ces fichiers.

$ rm *
or
$ rm -rf *

Utilisez plutôt,

$ rm ./*.txt

Placez simplement le nom du fichier entre guillemets simples et le reste des choses est identique.

$ touch '!12.txt'

Rien de plus, traitez un nom de fichier ayant At Sign comme un fichier nonrmal.

$ touch '@12.txt'

Aucune attention supplémentaire requise. Utilisez un fichier ayant ^ dans le nom de fichier comme fichier normal.

$ touch ^12.txt

Le nom de fichier doit être placé entre guillemets simples et vous êtes prêt à commencer.

$ touch '&12.txt'

Si le nom de fichier a des parenthèses, vous devez mettre le nom de fichier entre guillemets simples.

$ touch '(12.txt)'

Aucun soin supplémentaire nécessaire. Traitez-le simplement comme un autre fichier.

$ touch {12.txt}

Un nom de fichier comportant des chevrons doit être placé entre guillemets simples.

$ touch '<12.txt>'

Traitez le nom de fichier avec des crochets carrés comme des fichiers normaux et vous n'avez pas besoin de faire très attention.

$ touch [12.txt]

Ils sont très courants et ne nécessitent rien de plus. Faites simplement ce que vous auriez fait avec un fichier normal.

$ touch _12.txt

Avoir un signe égal à ne change rien, vous pouvez l'utiliser comme un fichier normal.

$ touch =12.txt

La barre oblique inverse indique au shell d'ignorer le caractère suivant. Vous devez mettre le nom du fichier entre guillemets simples, comme nous l'avons fait dans le cas du point-virgule. Le reste des choses est simple.

$ touch '.txt'

Vous ne pouvez pas créer un fichier dont le nom inclut une barre oblique (/) , tant que votre système de fichiers n’a pas rencontré de bogue. Il n'y a aucun moyen d'échapper à une barre oblique.

Donc, si vous pouvez créer un fichier tel que «/12.txt» ou «b/c.txt», alors soit votre système de fichiers a un bogue, soit vous avez le support Unicode, ce qui vous permet de créer un fichier avec une barre oblique. Dans ce cas, la barre oblique n'est pas une véritable barre oblique mais un caractère Unicode qui ressemble à une barre oblique.

Encore une fois, un exemple où vous n'avez pas besoin de faire une tentative particulière. Un nom de fichier comportant un point d'interrogation peut être traité de la manière la plus générale.

$ touch ?12.txt

Les fichiers commençant par le point (.) sont très spéciaux sous Linux et sont appelés fichiers dot. Ce sont des fichiers cachés généralement une configuration ou des fichiers système. Vous devez utiliser le commutateur «-a» ou «-A» avec la commande ls pour afficher ces fichiers.

La création, l'édition, le changement de nom et la suppression de ces fichiers sont simples.

$ touch .12.txt

Remarque: Sous Linux, vous pouvez avoir autant de points (.) que nécessaire dans un nom de fichier. Contrairement à d’autres points système dans le nom de fichier, cela ne signifie pas séparer le nom et l’extension. Vous pouvez créer un fichier comportant plusieurs points comme:

$ touch 1.2.3.4.5.6.7.8.9.10.txt

et vérifiez-le comme:

$ 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

Vous pouvez avoir une virgule dans un nom de fichier, autant que vous le souhaitez et vous n'avez besoin de rien de plus. Faites-le simplement de manière normale, comme simple nom de fichier.

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

Vous pouvez avoir deux-points dans un nom de fichier, autant que vous le souhaitez et vous n'avez besoin de rien de plus. Faites-le simplement de manière normale, comme simple nom de fichier.

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

Pour avoir des guillemets dans le nom du fichier, nous devons utiliser la règle d'échange. Par exemple, si vous avez besoin d'un guillemet simple dans le nom de fichier, mettez le nom du fichier entre guillemets et si vous avez besoin d'un guillemet double dans le nom de fichier, mettez-le entre guillemets simples.

$ touch "15'.txt"

and

$ touch '15”.txt'

Certains éditeurs sous Linux comme emacs créent un fichier de sauvegarde du fichier en cours d'édition. Le fichier de sauvegarde porte le nom du fichier d'origine plus un tilde à la fin du nom de fichier. Vous pouvez avoir un fichier dont le nom inclut le tilde, à n'importe quel endroit simplement comme:

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

Créez un fichier dont le nom comporte un espace entre les caractères/mots, dites «salut mon nom est avishek.txt».

Ce n'est pas une bonne idée d'avoir un nom de fichier avec des espaces et si vous devez distinguer un nom lisible, vous devez utiliser un trait de soulignement ou un tiret. Cependant, si vous devez créer un tel fichier, vous devez utiliser une barre oblique inverse qui ignore le caractère suivant. Pour créer le fichier ci-dessus, nous devons le faire de cette façon.

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

hi my name is avishek.txt

J'ai essayé de couvrir tous les scénarios que vous pourriez rencontrer. La plupart des implémentations ci-dessus sont explicitement pour BASH Shell et peuvent ne pas fonctionner dans un autre shell.

Si vous sentez que j'ai manqué quelque chose (qui est très commun et de nature humaine), vous pouvez inclure votre suggestion dans les commentaires ci-dessous. Restez connecté, continuez à commenter. Restez à l'écoute et connecté! Aimez-nous et partagez-nous et aidez-nous à nous propager!