Comment gérer les espaces dans les noms de fichiers sous Linux
Si vous avez un nom de fichier avec des espaces sur un système Linux, envelopper votre nom de fichier entre guillemets permet à Bash de le traiter correctement. La complétion par tabulation facilite la saisie des noms de fichiers sur la ligne de commande, même s’ils contiennent des espaces.
Comme la plupart des systèmes d’exploitation, Linux prend en charge les noms de fichiers contenant des espaces. Mais l’utilisation de ces noms de fichiers sur la ligne de commande n’est pas toujours simple. Voici plusieurs façons de gérer les noms de fichiers contenant des espaces.
Sommaire
L’humble nom de fichier
Tout ce qui est stocké sur le disque dur de votre ordinateur doit avoir un nom. Sans nom, aucun fichier n’existerait. Toutes les applications et les démons lancés au démarrage de votre ordinateur, ainsi que tous les logiciels que vous utilisez, doivent être identifiés et stockés dans un système de fichiers. Cette identification est le nom du fichier.’
La même chose s’applique aux fichiers que vous créez ou installez. Tous vos documents, images et musiques ont besoin de noms de fichiers. Sans noms de fichiers, aucun de vos actifs numériques ne pourrait exister. Parce que les noms de fichiers sont si importants, Linux s’efforce d’imposer le moins de règles possible sur leur composition.
Sous Linux, un nom de fichier peut contenir n’importe quel caractère à l’exception de la barre oblique « /
” et le caractère nul, 0x00
. Le caractère nul est utilisé pour marquer la fin d’une chaîne, il ne peut donc pas être présent dans la chaîne elle-même, sinon Linux tronquerait le nom de fichier à la position du caractère nul. La « /
” la barre oblique est utilisée comme séparateur dans les chemins de répertoire.
Les noms de fichiers sont sensibles à la casse et peuvent contenir jusqu’à 255 octets, y compris le caractère nul. Les chemins de répertoire peuvent comporter jusqu’à 4096 octets, y compris le caractère nul. Notez qu’il s’agit de leur longueur en octetsce qui pourrait ne pas correspondre directement à personnages. Les caractères Unicode 16 bits, par exemple, prennent deux octets chacun.
Les passionnés de rétro-informatique et ceux qui ont une longue mémoire sauront qu’au début des ordinateurs personnels, le système d’exploitation de disque de Microsoft, DOS, était insensible à la casse et avait une limite de nom de fichier de huit caractères, plus une extension de trois caractères.
Vous deviez être très réfléchi et parfois créatif lorsque vous nommiez des fichiers. En comparaison, la liberté dont nous disposons aujourd’hui signifie que nous pouvons nommer les fichiers comme nous le voulons, sans penser à autre chose que la description que nous créons pour ce fichier.
Mais avec les noms de fichiers, ce qui nous dérange le plus souvent, ce ne sont pas les caractères que nous tapons, ce sont les espaces entre eux.
Pourquoi les espaces dans les noms de fichiers Linux sont pénibles
Les shells tels que Bash interpréteront une chaîne de mots séparés par des espaces comme des arguments de commande individuels, et non comme un seul argument. Voici un exemple, en utilisant touch
pour créer un nouveau fichier appelé « mon nouveau fichier.txt ».
touch my new file.txt
ls
Comme on peut le voir, ls
nous montre qu’il y a trois fichiers créés, un appelé « mon », un autre appelé « nouveau » et un autre appelé « fichier.txt ».
Notez que touch
ne s’est pas plaint ou n’a pas lancé d’erreur. Il exécute ce qu’il pense que nous lui demandons de faire. Donc, il nous ramène silencieusement à la ligne de commande. Si nous ne sommes pas motivés pour vérifier, nous ne saurons pas que les choses ne se sont pas déroulées comme prévu.
Pour créer le fichier que nous voulions, nous devons citer ou échapper.
Comment citer et échapper aux espaces
Si nous citons le nom du fichier en entier, touch
sait qu’il doit traiter le texte cité comme un seul argument.
touch 'my new file.txt'
ls
Cette fois, nous obtenons le fichier unique que nous attendons.
Nous pouvons obtenir le même résultat si nous utilisons le caractère antislash « » pour s’évader des espaces. En « échappant » les espaces, ils ne sont pas traités comme des caractères spéciaux, c’est-à-dire des séparateurs d’arguments, ils sont considérés comme de simples anciens espaces.
touch my second new file.txt
ls
Cela fonctionne, mais échapper aux espaces rend la saisie des noms de fichiers plus lente et sujette aux erreurs. Les choses peuvent devenir vraiment moche si vous avez aussi des noms de répertoires avec des espaces.
cp dir one/my text file.txt dir two/my text file.bak
ls
Cette commande copie un seul fichier texte d’un répertoire appelé « dir one » vers un répertoire appelé « dir two », et enregistre la copie en tant que fichier BAK. Et c’est un exemple assez simple.
Comment résoudre le problème de l’espace à sa source
S’il s’agit de vos propres fichiers, vous pouvez prendre la décision politique de ne jamais utiliser d’espaces et créer (ou renommer en masse) des noms de fichiers comme celui-ci.
mynewtextfile.txt
Certes, c’est une solution robuste mais c’est quand même moche. Il existe de meilleures options, telles que l’utilisation de tirets « -
» ou souligne « _
” pour séparer vos mots.
my-new-text-file.txt
my_new_text_file.txt
Ces deux éléments contourneront le problème, et ils sont lisibles. Si vous ne souhaitez pas ajouter de caractères supplémentaires à vos noms de fichiers, vous pouvez utiliser CamelCase pour rendre vos noms de fichiers lisibles, comme ceci :
MyNewTextFile.txt
L’extension des onglets facilite la gestion des espaces
Bien sûr, adopter une convention de nommage et s’y tenir ne vous aidera que lorsque vous traitez vos propres fichiers. Il est peu probable que les fichiers provenant de n’importe où ailleurs suivent votre convention de dénomination adoptée.
Vous pouvez utiliser l’extension des onglets pour vous aider à « remplir » avec précision les noms de fichiers pour nous. Disons que nous voulons supprimer le fichier BAK que nous avons créé dans « dir deux », en utilisant rm
.
Nous commençons par taper « rm dir » car nous utilisons le rm
commande et nous savons que le nom du répertoire commence par « dir ».
rm dir
En appuyant sur la touche « Tab », Bash recherche des correspondances dans le répertoire actuel.
Il existe deux répertoires qui commencent par « dir », et dans les deux cas, le caractère suivant est un espace. Alors Bash ajoute le caractère antislash « ” et un espace. Bash attend alors que nous fournissions le caractère suivant. Il a besoin du caractère suivant pour différencier les deux correspondances possibles dans ce répertoire.
Nous allons taper un « t », pour « deux », puis appuyer sur « Tab » une fois de plus.
Bash complète le nom du répertoire pour nous et attend que nous tapions le début du nom de fichier.
Nous n’avons qu’un seul fichier dans ce répertoire, il suffit donc de taper la première lettre du nom de fichier, « m », pour que Bash sache quel fichier nous voulons utiliser. Taper « m » et appuyer sur « Tab » complète le nom de fichier pour nous, et « Entrée » exécute la commande entière.
L’extension des onglets permet de s’assurer que vous obtenez les bons noms de fichiers et accélère également la navigation et la saisie sur la ligne de commande en général.
Comment utiliser les noms de fichiers avec des espaces dans les scripts Bash
Il n’est pas surprenant que les scripts aient exactement les mêmes problèmes avec les espaces dans les noms de fichiers que la ligne de commande. Si vous transmettez un nom de fichier en tant que variable, assurez-vous de citer le nom de la variable.
Ce petit script vérifie le répertoire courant pour les fichiers qui correspondent au modèle de fichier « *.txt », et les stocke dans une variable appelée file_list
. UN for
boucle est utilisée pour effectuer une action simple sur chacun d’eux.
#!/bin/bash file_list=*.txt for file in $file_list do ls -hl $file done
Copiez ce texte dans un éditeur et enregistrez-le dans un fichier appelé « files.sh ». Utilisez ensuite le chmod
commande pour le rendre exécutable.
chmod +x files.sh
Nous avons quelques fichiers dans ce répertoire. L’un a un nom de fichier simple et les deux autres utilisent des traits de soulignement « _
» ou des tirets « -
” au lieu d’espaces. C’est ce que nous voyons lorsque nous exécutons le script.
./files.sh
Cela semble bien fonctionner. Mais changeons les fichiers du répertoire pour les fichiers contenant des espaces dans leurs noms.
./files.sh
Chaque mot de chaque nom de fichier est traité comme s’il s’agissait d’un nom de fichier en soi, et le script échoue donc. Mais tout ce que nous devons faire pour que le script gère les espaces dans les noms de fichiers est de citer le $file
variables à l’intérieur du for
boucle.
#!/bin/bash file_list=*.txt for file in $file_list do ls -hl "$file" done
Notez que le signe dollar « $
» est à l’intérieur des guillemets. Nous avons apporté cette modification et l’avons enregistrée dans le fichier de script « files.sh ». Cette fois, les noms de fichiers sont gérés correctement.
./files.sh
Espacé, mais pas floconneux
Éviter les espaces dans vos propres noms de fichiers ne vous mènera pas loin. Il est inévitable que vous rencontriez des fichiers provenant d’autres sources avec des noms contenant des espaces. Heureusement, si vous avez besoin de gérer ces fichiers sur la ligne de commande ou dans des scripts, il existe des moyens simples de le faire.