GNU/Linux >> Tutoriels Linux >  >> Linux

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 aurons affaire à 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
...

Exemples de noms de fichiers numériques :

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

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 le nom des 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.

Traitement d'un fichier dont le nom contient un tiret (-)

Créez un fichier qui commence par un tiret (-) , dites -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 après un tiret (-) , comme option, et évidemment il n'y a pas une telle option, d'où l'erreur.

Pour résoudre une telle erreur, nous devons indiquer au shell Bash (ceci et la plupart des autres exemples de l'article concernent BASH ) pour ne rien interpréter après un caractère spécial (ici tiret), en 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 modifier le fichier ci-dessus, vous pouvez :

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

Remarque  :Vous pouvez remplacer nano avec 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, 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 ./-*
Important à noter :

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

Traitement des 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.

Comprenez-le à l'aide d'exemples :

créer 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 donc l'ignorer. La commande touch a donc été transmise sans aucun fichier Operand, d'où l'erreur.

Pour résoudre une telle erreur, vous pouvez demander à BASH de ne pas interpréter # comme 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 à 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 un 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

Évident de l'exemple ci-dessus, il n'a créé que le fichier 'a ‘ et 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 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 sous :

$ 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 en tant que :

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

Pour supprimer tous les fichiers qui ont un hachage (# ) dans le nom du fichier, vous pouvez utiliser :

 # rm ./#*

Traitement des 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 ? Sinon, 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 en tant que commande mais n'a trouvé aucun opérande de fichier avant le point-virgule et signale donc une erreur. Il signale également une autre erreur que 'abc.txt ' commande introuvable, 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 :

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

Remarque :Nous avons mis le nom du fichier entre apostrophes '' . Il dit à BASH que ; fait partie du nom de fichier et non du séparateur de commandes.

Le reste de l'action (à savoir, copier, déplacer, supprimer) sur le fichier et le dossier ayant un point-virgule dans son nom peut être effectué directement en mettant 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 de manière normale, comme un simple nom de fichier 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 un astérisque dans le nom du fichier ne change rien et vous pouvez continuer à l'utiliser comme fichier normal.

$ touch *12.txt

Remarque :Lorsque vous devez supprimer un fichier qui commence 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 avec le signe arobase comme un fichier non rmal.

$ touch '@12.txt'

^ dans le nom du fichier

Aucune attention supplémentaire requise. Utiliser un fichier ayant ^ dans le nom du fichier en tant que fichier normal.

$ touch ^12.txt

L'esperluette (&) dans le nom du fichier

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

$ touch '&12.txt'

Parenthèses () dans le nom du fichier

Si le nom du fichier comporte 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 le 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

Traitement de 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 (/) , jusqu'à ce que votre système de fichiers ait un 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.

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 de points. 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 (.) selon vos besoins 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 cochez-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

Comma (,) 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éer 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 !


Linux
  1. Comment rediriger la sortie vers un fichier et Stdout sous Linux

  2. Comment extraire les fichiers .gz et .tar.gz sous Linux

  3. Comment empêcher la modification, la suppression et le changement de nom de fichier/répertoire sous Linux ?

  4. Comment taper des caractères spéciaux sous Linux ?

  5. Comment puis-je voir du en Go au lieu de Mo sous Linux ?

Comment travailler avec des liens durs et des liens souples sous Linux

Comment supprimer les caractères (^M) d'un fichier sous Linux

Comment supprimer les espaces des noms de fichiers sous Linux

Comment créer et utiliser un fichier d'échange sous Linux

Comment gérer les noms de fichiers avec des espaces sous Linux

Comment renommer tous les fichiers avec des caractères spéciaux et des espaces dans un répertoire ?