Remplacer les espaces par un underscore ?

Bonjour,

Je suis sur une Debian Stretch, mon SHell est : /bin/bash et je suis sous KDE depuis Konsole :slight_smile:

Je crée 2 fichiers :

touch fichier\ 1-1.txt
touch fichier\ 2-2.txt

J’ai mes 2 fichiers dans un répertoire QUE je souhaite modifier (supprimer les espaces) et cela sans fichier (en ligne de commande) :

18:02:07 root@orj:~ $ ls -l .
total 3
-rw-r--r-- 1 root root    0 févr.  2 17:52 fichier 1-1.txt
-rw-r--r-- 1 root root    0 févr.  2 17:52 fichier 2-2.txt

j’essaie de faire simplement pour tester la commande sed :

find . -type f -name "*.txt" -exec sed -r 's/ /_/g' {} +

Cela ne me ressort rien !

Si j’envoie cela (tout va bien) :

18:11:08 root@orj:~ $ find . -type f -name "*.txt" -exec ls -l {} +
-rw-r--r-- 1 root root 0 févr.  2 17:52 ./fichier 1-1.txt
-rw-r--r-- 1 root root 0 févr.  2 18:08 ./fichier 2-2.txt

Au final ce serait quelque chose comme cela (avec un boucle depuis la console) :

for i in "*.txt"; do mv $i `sed -r -n 's/ /_/g' $i`; done;

NdM : Avant sed et après $i (avant le done) il un apostrophe à l’envers. :confused:

Mais je n’y arrive pas. Qui peut m’aider ^^

En vous remerciant.

Cordialement,
Romain

rename 's/\s+/_/g' *

dans un alias:

alias bouchetrous='rename '\''s/\s+/_/g'\'''
2 J'aime

Merci @josephtux ! Trop fort :wink:

Il suffisait de connaître l’existence de la commande rename, très utile et très simple.

Par exemple, aujourd’hui j’ai fait:

rename -- 's/^-//' *
pour supprimer tous les «-» en début de nom de fichier qui perturbent beaucoup de commandes (toutes celles qui ignorent le paramètre «- -»)

Elle peut faire des choses très compliquées et subtiles, en fonction de ses compétences avec les expressions régulières. C’est un script Perl, donc il bénéficie de tout ce que les regex de Perl offrent.

1 J'aime

Ou en pur bash*:
for file in *.txt ; do mv "$file" ${file/ /_} ; done

cf http://wiki.bash-hackers.org/syntax/pe#search_and_replace

* enfin presque, puisque mv n’est pas une commande built-in

Ce que j’aime bien avec rename aussi c’est l’option -nono qui permet de simuler le renommage, pour s’assurer que la commande fera bien ce qu’on veut.

1 J'aime

Je viens de déplacer le fil, l’erreur est régulière … la catégorie ‘Trucs et Astuces’ est là pour en proposer pas en demander :stuck_out_tongue:

Est-ce que tu aurais une référence synthétique sur les “quoting tricks” de bash ? Tu savais tout de suite que tu devais tripler la première quote de la commande rename dans l’alias, ou comme moi tu tâtonnes à chaque fois que des quotes ou des double quotes doivent s’encastrer ?

J’ai fais ça il y a longtemps, mais j’ai certainement du chercher à comprendre et tatonner.
Désolé de décevoir sur mes compétences!

@Sputnik93
Merci, très utile «-nono » (-n), car les «rename» trop vite fais sont parfois pénibles à défaire!
« rename -n » m’évitera certainement quelques angoisses et bévues.

1 J'aime

ça ne serais pas plutôt:

mv "$file" ${file// /_}

(2 slash avant l’espace, que je représente ici par ÷, ne réussissant pas à afficher « 2 slash puis un espace puis un slash puis le signe _»)

1 J'aime

Bonsoir josephtux

J’espère que je ne me suis pas trompé en modifiant la présentation de ligne de commande que tu proposais dans ton message en fonction de la description que tu donnais entre parenthèses.

J’ai fait précéder et suivre ta ligne de commande par une ligne vide ne contenant que trois caractères backtics

Tu peux visualiser le texte brut de ton message
en cliquant sur l’icône qui ressemble à un crayon qui est située entre le drapeau et les trois points

1 J'aime

Merci MicP
C’est exactement ça.

Pour écrire du code, il faut 3 “anti-apostrophes” sur une ligne séparée, avant et après le code, précédé d’une ligne vide? c’est bien celà?

1 J'aime

Oui, C’est bien ça.

1 J'aime

Si tu doubles le premier slash, tu remplaces chaque espace par un underscore, si tu ne mets qu’un seul slash, tu remplaces uniquement le premier. Cela dépend de ce que tu veux faire.

Oui, et c’est ce que ZW3B cherchait, puisqu’il veut supprimer les espaces de noms de fichiers.

Bonjour

Tu as certe résolue ton problème mais je te signale que tu peux utiliser les script bash avec les espaces en modifiant la variable IFS

Mets toi dans un dossier où tu as des noms de fichiers avec des espaces

for i in $(ls); do
echo $i
done

comme tu le constates ce n’est pas bon, essaye comme ci-dessous

IFS='
'
for i in $(ls); do
echo $i
done

Normalement c’est bon

Pourquoi
for i in $(ls)
quand (je crois que)
for i in *
fait le même travail (contrairement à ls -A)?

D’autre part, paresse sans doute, avoir à modifier IFS pour chaque commande en ligne est pénible, c’est pourquoi je préfère «boucher les trous» systématiquement et oublier le problème qui ressurgirait un jour ou l’autre, sans doute dans une situation plus désagréable.

Mais il n’est pas inutile d’en rappeler l’existence, particulièrement utile dans les scripts.