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 touch
pour créer un nouveau fichier appelé « mon nouveau fichier.txt ».
touch my new file.txt
ls
Comme nous pouvons le voir, ls
cela 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 touch
ne 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, touch
il 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 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
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
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 rm
commande et nous savons que le nom du répertoire commence par « dir ».
rm dir
En appuyant sur la touche « Tab », Bash recherche les 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. 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 ».
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.
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
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 modifions les fichiers du répertoire pour les fichiers qui contiennent 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 à 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 $file
variable à l’intérieur de la for
boucle.
#!/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
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