Comment gérer les espaces dans les noms de fichiers sous Linux

Comment gérer les espaces dans les noms de fichiers sous Linux

Points clés à retenir

Si vous avez un nom de fichier avec des espaces sur un système Linux, mettre 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 utiliser 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.

Comment fonctionnent les noms de fichiers Linux ?

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 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 dossier.

La même chose s’applique aux fichiers que vous créez ou installez. Tous vos documents, images et musiques nécessitent des 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 concernant leur composition.

Sous Linux, un nom de fichier peut contenir n’importe quel caractère à l’exception de la barre oblique « / » et du 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 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 avoir une longueur maximale de 4 096 octets, y compris le caractère nul. Notez qu’il s’agit de leur longueur en octets, ce qui peut ne pas correspondre directement à des caractères. Les caractères Unicode 16 bits, par exemple, occupent deux octets chacun.

Les amateurs d’informatique rétro et ceux qui ont la mémoire longue sauront qu’au début des ordinateurs personnels, le système d’exploitation de disque de Microsoft , DOS, n’était pas sensible à la casse et avait une limite de nom de fichier de huit caractères, plus une extension à 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 bon nous semble, sans penser à autre chose que la description que nous créons pour ce fichier.

Mais avec les noms de fichiers, ce qui nous fait le plus souvent trébucher, ce ne sont pas les caractères que nous tapons, mais les espaces qui les séparent.

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 d’utilisation touchpour créer un nouveau fichier appelé « mon nouveau fichier.txt ».

touch my new file.txt ls

Essayer d'utiliser Touch pour créer un fichier avec des espaces dans son nom

Comme nous pouvons le voir, lscela 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 cela touchne s’est pas plaint ni n’a généré d’erreur. Il exécute ce qu’il pense que nous lui demandons de faire. Cela nous ramène donc silencieusement à la ligne de commande. Si nous ne sommes pas motivés à vérifier, nous ne saurons pas que les choses ne se sont pas déroulées comme prévu.

Pour créer le fichier souhaité, nous devons citer ou échapper.

Comment citer et échapper aux espaces

Si nous citons le nom complet du fichier, touchil sait qu’il doit traiter le texte cité comme un seul argument.

touch 'my new file.txt' ls

Utiliser Touch pour créer un fichier avec des espaces dans son nom, avec le nom de fichier entier entre guillemets

Cette fois, nous obtenons le fichier unique que nous attendons.

Nous pouvons obtenir le même résultat si nous utilisons le caractère barre oblique inverse «\ » pour échapper aux espaces. En « échappant » aux 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

Utiliser Touch pour créer un fichier avec des espaces dans son nom échappés par des barres obliques inverses

Cela fonctionne, mais les espaces d’échappement rendent la saisie des noms de fichiers plus lente et sujette aux erreurs. Les choses peuvent devenir vraiment laides si vous avez également des noms de répertoire contenant des espaces.

cp dir one/my\ text\ file.txt dir\ two/my\ text file.bak ls

Utilisation d'espaces d'échappement dans une commande pour copier un fichier d'un répertoire à un autre

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 d’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 de créer (ou de renommer en bloc ) des noms de fichiers comme celui-ci.

mynewtextfile.txt

Certes, c’est une solution robuste mais elle reste moche. Il existe de meilleures options, comme l’utilisation de tirets «- » ou de traits de soulignement «_ » pour séparer vos mots.

my-new-text-file.txt my_new_text_file.txt

Ces deux éléments contourneront le problème et seront 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 entendu, adopter une convention de dénomination et s’y tenir ne sera utile que lorsque vous traitez vos propres fichiers. Il est peu probable que les fichiers provenant d’ailleurs suivent la convention de dénomination que vous avez 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 two », en utilisant rm.

Nous commençons par taper « rm dir » car nous utilisons la rmcommande et nous savons que le nom du répertoire commence par « dir ».

rm dir

Taper le début d'une commande, avant d'appuyer sur la tabulation pour utiliser la complétion par tabulation

En appuyant sur la touche « Tab », Bash recherche les correspondances dans le répertoire actuel.

Appuyer sur Tab a ajouté une barre oblique inverse et un espace au chemin de répertoire partiel

Il existe deux répertoires qui commencent par « dir », et dans les deux cas le caractère suivant est un espace. Bash ajoute donc le caractère barre oblique inverse «\ » et un espace. Bash attend ensuite que nous fournissions le personnage 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 à nouveau sur « Tab ».

Le chemin du répertoire après la saisie

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, donc taper la première lettre du nom de fichier, « m », suffit pour indiquer à Bash quel fichier nous voulons utiliser. Taper « m » et appuyer sur « Tab » complète le nom du fichier pour nous, et « Entrée » exécute la commande entière.

Le nom complet du fichier complété en appuyant sur

L’expansion des onglets permet de garantir facilement 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 dans le répertoire actuel les fichiers qui correspondent au modèle de fichier « *.txt » et les stocke dans une variable appelée file_list. Une boucle for permet d’effectuer une action simple sur chacun.

#!/bin/bashfile_list=*.txtfor file in $file_listdo ls -hl $filedone

Copiez ce texte dans un éditeur et enregistrez-le dans un fichier appelé « files.sh ». Ensuite, utilisez la commande chmod pour le rendre exécutable.

chmod +x files.sh

Utiliser chmod pour rendre le script exécutable

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

Exécution du script files.sh avec des noms de fichiers ne contenant aucun espace

Cela semble bien fonctionner. Mais modifions les fichiers du répertoire pour les fichiers qui contiennent des espaces dans leurs noms.

./files.sh

Exécution du script files.sh avec des noms de fichiers contenant des espaces

Chaque mot de chaque nom de fichier est traité comme s’il s’agissait d’un nom de fichier à part entière, 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 la $filevariable à l’intérieur de la forboucle.

#!/bin/bashfile_list=*.txtfor file in $file_listdols -hl "$file"done

Notez que le signe dollar «$ » se trouve entre 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

Le script files.sh modifié gère correctement les fichiers avec des espaces dans leurs noms de fichiers

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 dont les noms contiennent des espaces. Heureusement, si vous devez gérer ces fichiers sur la ligne de commande ou dans des scripts, il existe des moyens simples de le faire.

Commandes Linux

Des dossiers

tar · pv · chat · tac · chmod · grep · diff · sed · ar · homme · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · rejoindre · jq · plier · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · chaînes · type · renommer · zip · décompresser · monter · umount · installer · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convertir · rclone · déchiqueter · srm · scp · gzip · chattr · couper · trouver · umask · wc · tr

Processus

alias · écran · haut · sympa · renice · progrès · strace · systemd · tmux · chsh · historique · à · lot · gratuit · lequel · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · mur · oui · tuer · dormir · sudo · su · temps · groupadd · usermod · groupes · lshw · arrêt · redémarrage · arrêter · mise hors tension · passwd · lscpu · crontab · date · bg · fg · pidof · nohup · pmap

La mise en réseau

netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · creuser · doigt · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw · arping · pare-feu

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *