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!