Recherche de site Web

Comment manipuler les noms de fichiers contenant 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 fichiers alphanumériques sont assez courants et très largement utilisés, mais ce n'est pas le cas lorsque nous devons traiter des noms de fichiers/dossiers contenant des caractères spéciaux.

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

Voici des exemples de noms de fichiers les plus courants :

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

Voici des exemples de noms de fichiers numériques :

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

Voici des exemples de noms de fichiers alphanumériques :

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 sur terre crée/traite des noms de fichiers/dossiers ayant un hachage (#), 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 courants, mais votre shell ne doit pas se casser/abandonner lorsque vous devez gérer de tels noms de fichiers. De plus, techniquement parlant, tout, que ce soit un dossier, un pilote ou toute autre chose, est traité comme un fichier sous Linux.

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

Créez un fichier qui commence par un tiret (-), par exemple -abx.txt.

$ touch -abc.txt
Exemple de sortie
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 (yup 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 longue liste.

$ ls -l

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

Pour éditer 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, par exemple 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, il faut 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 voulez tous les supprimer d'un coup, faites comme :

$ rm ./-*

1. La même règle que celle décrite ci-dessus s'applique à tout nombre de traits d'union 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 s'applique au nom du dossier ayant un nombre quelconque de traits d'union et leur occurrence, à l'exception du 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 dans 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
Exemple de sortie
touch: missing file operand
Try 'touch --help' for more information.

La raison de l'erreur ci-dessus, que Bash interprète #abc.txt un commentaire et l'ignore donc. Ainsi, la commande touch a été passée sans aucun fichier Operand, et c'est donc 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 en tant que :

$ 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 au début.

$ 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, il n'a créé que le fichier 'a' et le fichier '#bc' a été ignoré. 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 le vérifier comme suit :

$ 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 l'éditeur de votre choix 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 contenant un dièse (#) dans le nom du fichier, vous pouvez utiliser :

 # rm ./#*

Traiter les fichiers ayant un point-virgule (;) dans leur nom

Au cas où vous ne le sauriez pas, le point-virgule agit comme un séparateur de commande dans BASH et peut-être également dans un autre 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 ? Si ce n'est pas ici, vous le ferez.

Créez un fichier contenant un point-virgule.

$ touch ;abc.txt
Exemple de sortie
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 touch comme une commande mais ne trouve aucun opérande de fichier avant le point-virgule et, par conséquent, il signale une erreur. Il signale également une autre erreur indiquant que la commande abc.txt est introuvable, uniquement parce qu'après le point-virgule, BASH attendait une autre commande et que 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 :

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

Remarque : Nous avons placé le nom du fichier entre guillemets simples . Il indique à BASH que ; fait partie du nom de fichier et non du séparateur de commandes.

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.

Traitement des autres caractères spéciaux dans le nom du fichier/dossier

Signe plus (+) dans le nom du fichier

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

$ touch +12.txt 

Signe dollar ($) dans le nom du fichier

Vous devez placer 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'

Pourcentage (%) dans le nom du fichier

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

$ touch %12.txt

Astérisque (*) dans le nom du fichier

Avoir Asterisk dans le nom de fichier ne change rien et vous pouvez continuer à l'utiliser comme 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

Point d'exclamation (!) dans le nom du fichier

Placez simplement le nom du fichier entre guillemets simples et le reste est le même.

$ touch '!12.txt'

Arobase (@) dans le nom du fichier

Rien de plus, traitez un nom de fichier ayant le signe arobase comme un fichier non rmal.

$ touch '@12.txt'

^dans le nom du fichier

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

$ touch ^12.txt

Esperluette (&) dans le nom du fichier

Le nom de fichier doit être entouré de guillemets simples et vous êtes prêt à partir.

$ touch '&12.txt'

Parenthèses() dans le nom du fichier

Si le nom du fichier contient des parenthèses, vous devez entourer le nom du fichier de guillemets simples.

$ touch '(12.txt)'

Accolades {} dans le nom du fichier

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

$ touch {12.txt}

Chevrons dans le nom du fichier

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

$ touch '<12.txt>'

Crochets [ ] dans le nom du fichier

Traitez les noms de fichiers ayant des crochets comme des fichiers normaux et vous n'avez pas besoin d'en prendre particulièrement soin.

$ touch [12.txt]

Sous-score (_) dans le nom du fichier

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

Égal à (=) dans le nom du fichier

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

$ touch =12.txt

Traiter la barre oblique inverse (\)

La barre oblique inverse indique au shell d'ignorer le caractère suivant. Vous devez placer 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'

Le cas particulier de la barre oblique

Vous ne pouvez pas créer un fichier dont le nom comprend une barre oblique (/), tant que votre système de fichiers n'a pas 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', soit votre système de fichiers a un bogue, soit vous avez le support Unicode, 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.

Point d'interrogation (?) dans le nom du fichier

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

$ touch ?12.txt

Point (.) dans le nom du fichier

Les fichiers commençant par le point (.) sont très spéciaux sous Linux et sont appelés fichiers point. 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 de 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 suit :

$ 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

Virgule (,) dans le nom du fichier

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 de manière normale, en tant que simple nom de fichier.

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

Deux-points (:) dans le nom du fichier

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 de manière normale, en tant que simple nom de fichier.

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

Avoir des guillemets (simples et doubles) dans le nom du fichier

Pour avoir des guillemets dans le nom du fichier, nous devons utiliser la règle d'échange. C'est-à-dire que si vous avez besoin d'avoir un guillemet simple dans le nom du fichier, placez le nom du fichier avec des guillemets doubles et si vous avez besoin d'avoir un guillemet double dans le nom du fichier, mettez-le avec un guillemet simple.

$ touch "15'.txt"

and

$ touch '15”.txt'

Tilde (~) dans le nom du fichier

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

Espace blanc dans le nom du fichier

Créez un fichier dont le nom comporte un espace entre caractère/mot, dites \salut, je m'appelle avishek.txt.

Ce n'est pas une bonne idée d'avoir un nom de fichier avec des espaces et si vous devez un nom lisible distinct, 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 inversée 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 destinées à BASH Shell et peuvent ne pas fonctionner dans d'autres shells.

Si vous pensez que j'ai raté quelque chose (c'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!