Rechercher : dans
Par :

Remplacer espacements dans noms de fichier

Dernière réponse le 6 mar 2009 à 08:26:01 artagon7, le 11 aoû 2007 à 21:11:37 
 Signaler ce message aux modérateurs

Bonjour,

J'essaie d'écrire un script qui a pour but d'éliminer les espacements dans les noms de fichiers pour les remplacer par des traits soulignés ('underscore') mais je n'y arrive pas. Je crois que je ne suis pas très loin du but.

J'ai essaye deux facons differentes.

Première façon

#! /bin/bash
rep="/media/sda5/Informatique/Linux/Test"
cd $rep
for file in * ; do
mv -T "$file" ${file/ /_}
done


Ce programme marche avec des fichiers qui ont un espacement mais ca ne fonctionne pas avec ceux qui ont deux espacements et plus.

Deuxième façon

#! /bin/bash
rep="/media/sda5/Informatique/Linux/Test"
cd $rep
for file in * *; do
ls $rep | awk '{ gsub(/ /,"_") ; a=$7$8$9 ; print $a ; export $a}';
mv -T "$file" $a
done


Si vous exécutez ce deuxieme script, vous constaterez que les espacements sont bel et bien remplacés par des soulignés et qu'ils s'affichent à l'écran MAIS TOUT ÇA L'INTÉRIEUR DE awk. Ce programme affiche à l'écran les noms de fichiers de la bonne facon mais ne corrige pas les noms dans le répertoire.

Le problème survient lorsque je fais la commande mv -T "$file" $a, le shell ne voit pas la valeur du deuxième fichier soit $a. La valeur de $a reste à l'intérieur de la commande awk. Mais comment sortir la variable $a de awk ... c'est ça mon problème. Ça m'amène à poser une question plus générale.

Comment fait on pour assigner à une variable du shell le résultat d'une commande effectué par awk?


Merci,

Configuration: Linux
Konqueror 3.5

Meilleures réponses pour « Remplacer espacements dans noms de fichier » dans :
[Windows] Obtenir la liste des fichiers d'un dossier VoirLister le contenu d'un dossier Voici une astuce simple qui permet de lister le nom des fichiers contenus dans un répertoire. Vous pourrez obtenir en un clic les titres de vos chansons, de vos photos, etc. dans un fichier...
Sed - Insertion de texte VoirInsérer du texte dans un fichier Introduction Syntaxe Ajout de texte Insérer une ligne avec "i" Ajouter une ligne avec "a" Échanger une ligne avec "c" Introduction Il est parfois utile de pouvoir insérer du texte en en-tête d'un ou...
Renommer plusieurs fichiers en batch VoirLe fait de renommer un grand nombre de fichiers peut très vite devenir fastidieux. Heureusement, il existe des outils permettant d'automatiser cette tâche dans un grand nombre de cas : Fonctionnalités natives Utilisation d'un programme...
Télécharger TextCrawler VoirVoulez –vous effectuer un remplacement dans vos milliers fichiers textes ? TestCrawler est votre logiciel. TestCrawler est un logiciel permettant de d’effectuer une recherche et un remplacement dans plusieurs fichiers textes. Il est...
Télécharger Ant Renamer VoirANT Renamer permet de renommer un grand nombre de fichiers et dossiers en quelques clics. Il ne fait que modifier les noms des fichiers/dossiers : Changement d'extension Remplacement de chaînes de caractères par d'autres Insertion d'une chaîne...
Formats et extensions de fichiers VoirRemarque : La liste ci-dessous n'est pas exhaustive et certains noms d'extension peuvent avoir plusieures fonctionnalités. Quant aux programmes proposés pour utiliser ces fichiers, ils ne sont pas forcément les seuls, ni les plus...
Fichier ZIP VoirFormat ZIP Un fichier ZIP est un fichier compressé. Dans le cas de fichiers découpés, il peut être accompagné de fichiers dont les noms sont séquentiellement R01, R02, R03, R04, etc. Lire un fichier ZIP Pour décompresser un fichier ZIP, il...
Fichier SFV VoirFormat SFV Un fichier SFV est un fichier de contrôle d'intégrité accompagnant généralement des fichiers RAR, dont les noms se suivent séquentiellement R01, R02, R03, R04, etc (ou .001, .002, .004, etc.). Ainsi, le logiciel SFV Checker permet de...

1

lami20j, le 11 aoû 2007 à 21:20:16

Salut,

si tu as la commande rename sur ton pc tu peux faire avec ça

lami20j@deb:~/trash/fic$ ls -1
aaa bbb
ddd eee
ddd eee kdjf
ddd eee kdjf lsdkjfklsd
   ddd eee kdjf lsdkjfklsd  dfj
lami20j@deb:~/trash/fic$ rename 's/\s+/_/g' *
lami20j@deb:~/trash/fic$ ls -1
aaa_bbb
ddd_eee
ddd_eee_kdjf_
ddd_eee_kdjf_lsdkjfklsd_
_ddd_eee_kdjf_lsdkjfklsd_dfj_
lami20j@deb:~/trash/fic$
lami20j

Répondre à lami20j

2

artagon7, le 11 aoû 2007 à 22:02:35

Salut lami20j,

Je viens de verifier et la commande RENAME est disponible dans mon shell. La, tu ne le sais peut-etre pas mais tu viens de me rendre un tres grand service.

Mais si tu peux, tu peux mettre une cerise sur mon sundae en me disant si je peux mettre le resultat d'un traitement de la commande awk dans une variable. Ca pourra m'etre utile a l'avenir. Ca n'a pas beaucoup de sens que de traiter des donnees et de ne pas les mettre dans des variables et de se contenter seulement de les afficher. Il y a surement un moyen de le faire. Les pages man de mawk ne sont pas tellement claires.

J'ai essaye des choses du genre :

nouveau_fichier=echo abacd | awk '{ gsub(/a/, "A"}'
mv -T vieux_fichier nouveau_fichier


mais ca ne fonctionne pas.

Si tu ne le sais pas, ce n'est pas si grave. Tu en as deja assez fait. J'ai plus de 1500 fichiers a changer de noms. Tu imagines donc le temps epargne par ta commande.

Pour le moment, je vais essayer ta commande sur mes fichiers.

Merci infiniment lami20j

Répondre à artagon7

3

lami20j, le 11 aoû 2007 à 22:15:47

Bon, awk je n'ai pas fait (ça me suffit perl :-))
en revanche voici avec sed

:~/trash/fic$ ls -1
aaa bbb
ddd eee
ddd eee kdjf
ddd eee kdjf lsdkjfklsd
   ddd eee kdjf lsdkjfklsd  dfj
:~/trash/fic$ IFS="\n";for i in *;do mv $i $(echo $i | sed -r 's/\s+/_/g');done
:~/trash/fic$ ls -1
aaa_bbb
ddd_eee
ddd_eee_kdjf_
ddd_eee_kdjf_lsdkjfklsd_
_ddd_eee_kdjf_lsdkjfklsd_dfj_
lami20j@deb:~/trash/fic$
lami20j

Répondre à lami20j

4

lami20j, le 11 aoû 2007 à 22:21:00

Voilà ta commande avec awk

:~/trash/fic$ nouveau_fichier=$(echo abacd | awk '{ gsub(/a/, "A");print}')
:~/trash/fic$ echo $nouveau_fichier
AbAcd
à toi d'adapter à ton cas :-) lami20j

Répondre à lami20j

5

lami20j, le 11 aoû 2007 à 22:27:00

Ok, et voilà une version awk

$ ls -1
aaa bbb
ddd eee
ddd eee kdjf
ddd eee kdjf lsdkjfklsd
   ddd eee kdjf lsdkjfklsd  dfj
$ IFS="\n";for i in *;do mv $i $(echo $i | awk '{ gsub(/ /, "_");print}');done
$ ls -1
aaa_bbb
ddd_eee
ddd_eee_kdjf_
ddd_eee_kdjf_lsdkjfklsd_
___ddd_eee_kdjf_lsdkjfklsd__dfj__
$
lami20j

Répondre à lami20j

6

jipicy, le 11 aoû 2007 à 22:28:43

Salut,

Pour la petite histoire de ton script de départ :

[tmpfs]$ var="Mon fichier avec plein d'espaces"
[tmpfs]$ echo $var
Mon fichier avec plein d'espaces
[tmpfs]$ echo ${var// /_}
Mon_fichier_avec_plein_d'espaces
[tmpfs]$
Donc en adaptant :
#! /bin/bash
rep="/media/sda5/Informatique/Linux/Test"
cd $rep
for file in * ; do
mv -T "$file" ${file// /_}
done 
;-))
Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

7

lami20j, le 11 aoû 2007 à 22:31:18

Salut,

je crois qu'on peut mettre résolu :-)
qu'en penses-tu?! ;-) lami20j

Répondre à lami20j

8

jipicy, le 11 aoû 2007 à 22:36:42

qu'en penses-tu?
De crabe ou de cheval...

Je te laisse chercher, bonne soirée et te casses pas trop la tête ;-)))))))
Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

9

artagon7, le 13 aoû 2007 à 00:37:35
  • +1

Salut,

Désolé lami20j et jipicy pour le délai de ma réponse mais j'ai eu un problème avec Internet. Après avoir essayé les trois autres façons que vous m'avez suggérées j'ai constaté qu'elles fonctionnent toutes très bien.

Donc, on récapitule les différentes facons pour remplacer les espacements par des traits soulignés dans des noms de fichiers.


Méthode 1 - Avec la commande rename (de lami20j)

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


Méthode 2 - Avec la commande sed (de lami20j)

IFS="\n";for i in *;do mv $i $(echo $i | sed -r 's/\s+/_/g');done


Méthode 3 - Avec la commande awk (de lami20j)

IFS="\n";for i in *;do mv $i $(echo $i | awk '{ gsub(/ /, "_");print}');done


Méthode 4 - Avec la commande mv (de jipicy)

for file in * ; do mv -T "$file" ${file// /_} done


On constate donc qu'il y a plusieurs facons d'arriver au même résultat. Dire que j'ai passé plus d'une semaine sur ce problème. Mais ca m'a fait une très bonne pratique sur le shell. J'en connais beaucoup plus. Surtout avec l'assignation du traitement d'une commande awk a une variable donnée par lami20j. Je ne comprends pas car il me semble avoir essaye ça avant. En tous les cas...

Mais jipicy tu m'as fait sursauté avec ta solution car je constate que j'étais à un slash près d'avoir la solution!!! Je crois que je vais prendre la moitié du crédit ;). Ça veut donc dire que le bash considère le symbole / plus un espacement comme un espace.

Et oui, lami20j tu as bien raison. Je crois que je peux mettre maintenant ce problème comme étant RÉSOLU.


Donc, merci beaucoup à vous deux :)

Répondre à artagon7

10

jipicy, le 13 aoû 2007 à 09:28:09

Re-

Ça veut donc dire que le bash considère le symbole / plus un espacement comme un espace.
Pas tout a fait. Les "/" sont des délimiteurs, après entre ces slashs tu mets ce qui doit être mis en correspondance et être remplacer dans ta variable.

Voir : man bash -P 'less -p "paramètre/motif/chaîne"'

;-)) Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

11

artagon7, le 14 aoû 2007 à 19:50:46

Salut jipicy,

Je n'ai pas tout a fait saisi ce que tu voulais dire. Mais je vais relire la page man de bash a propos des parametres, motifs et chaine. Mais je ne comprends pas pourquoi tu mets des mots francais entre guillemets dans la commande que tu donnes.

$ man bash -P 'less -p "paramètre/motif/chaîne"'

L'option -P correspond a specifier quel "output pager" utiliser.

J'ai essaye ta commande et ca donne :

Pattern not found (press RETURN)

Je presse RETURN et ca me ramene tout simplement a la page man de bash en anglais. Je travaille avec Edgy Eft.

Est-ce que tes pages man sont en francais?

Merci

Répondre à artagon7

12

jipicy, le 14 aoû 2007 à 21:03:08

Re-

Est-ce que tes pages man sont en francais?
Pour la plupart oui ;-))

       ${paramètre/motif/chaîne}
       ${paramètre//motif/chaîne}
              Le  motif  est  développé  comme  dans le traitement des noms de
              fichiers.  Le paramètre est développé et la plus longue  portion
              correspondant  au  motif  est remplacée par la chaîneg.  Dans la
              première forme, seule la première correspondance est  remplacée,
              dans  la seconde toutes les portions correspondant au motif sont
              remplacées par la chaîne.  Si le motif commence par #,  il  doit
              correspondre  au début de la valeur développée du paramètre.  Si
              le motif commence par %,  il  doit  correspondre  à  la  fin  du
              développement  du  paramètre.   Si la chaîne est nulle, les por-
              tions correspondant au motif sont supprimées et le  /  après  le
              motif  peut  être omis.  Si le paramètre est @ ou *, l'opération
              de substitution est appliquée à chacun des paramètres  position-
              nels  successivement, et le résultat est la liste finale.  Si le
              paramètre  est  une  variable  tableau  indexée  par  @  ou   *,
              l'opération  de  substitution  s'applique  à  chaque  membre  du
              tableau successivement, et le résultat est la liste finale.
;-))
Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

13

artagon7, le 17 aoû 2007 à 07:11:44

Salut Jipicy,

C'est bon a savoir car mon anglais est souvent deficient.

Merci ;)

Répondre à artagon7

14

tifo85, le 6 mar 2009 à 00:44:49

Slt
esque en peut elliminer les blanc exemple :
Donner : aaa zzz eee
res : aaazzzeee
merci

Répondre à tifo85

15

 jipicy, le 6 mar 2009 à 08:26:01

Salut,

Oui.

[tmpfs]$ var="Mon nom de fichier avec plein d'espaces"

[tmpfs]$ echo ${var}
Mon nom de fichier avec plein d'espaces

[tmpfs]$ echo ${var// /}
Monnomdefichieravecpleind'espaces

[tmpfs]$ echo ${var} | tr -d ' '
Monnomdefichieravecpleind'espaces

[tmpfs]$
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy