Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3066 connectés 

  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  [RESOLU] Shell script, espaces et noms de fichiers

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[RESOLU] Shell script, espaces et noms de fichiers

n°720192
Xavier_OM
Monarchiste régicide (fr quoi)
Posté le 23-08-2005 à 10:18:53  profilanswer
 

Ceci est sans doute le 794616ème sujet que vous lisez un topic sur ce sujet, désolé :D
 
Le sempiternel problème des noms de fichiers avec espaces en shell script
 
 
Soit un répertoire contenant des fichiers avec des espaces :

$ls
01. Phallic Tractor.mp3         08. Waiting.mp3
02. Fire Of Rock.mp3            09. Poison Eyes.mp3
03. Snakebite.mp3               10. B.R.O..mp3
04. Technical Difficulties.mp3  11. God Of The Sun.mp3
05. Miss Mistreater.mp3         12. Give It To Me.mp3
06. Bolt In My Heart.mp3        13. The Executioner's Song.mp3
07. 17th Moon.mp3               14. Children Of The Grave.mp3


 
 
Soit un "renommage" qui marche (j'ai mis cp, ca pourrait être mv ou une conversion mp3 to wav) :

$ for i in *.mp3
> do
> cp "$i" "$i".wav
> done


 
Ce qui produit des fichiers "01. Phallic Tractor.mp3.wav"
 
 
Soit un "renommage" qui se veut plus fin et qui ne marche pas :

$ for i in *.mp3
> do  
> cp "$i" `basename "$i" .mp3`.wav
> done


 
 
La question est : comment opérer un traitement sur $i plus fin que (basename) ou (echo "$i" | cut) pour obtenir des fichiers "01. Phallic Tractor.wav", tout en respectant les contraintes d'espacement ?
 
On pourrait bricoler avec $IFS, mais ca me semble un peu dangereux :/
 
Quelle est la solution à ce problème canonique ? Le but n'est pas d'appeler rename ou mmv, c'est plus général en fait : comment récupérer le basename d'un fichier contenant des espaces ?
 
 
Il existe bien ceci, mais c'est valable sous bash et pas sous sh non ?
$ for i in *.mp3
> do
> filename=${i%.mp3}
> cp "$i" "$filename".wav
> done


Message édité par Xavier_OM le 23-08-2005 à 11:29:23

---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
mood
Publicité
Posté le 23-08-2005 à 10:18:53  profilanswer
 

n°720209
jlighty
Posté le 23-08-2005 à 10:44:22  profilanswer
 

Une chose que tu peux faire :
quand tu obtiens le nom complet du fichier dans $i, utilise sed pour qu'il remplace mp3 par wav (attention cela suppose que mp3 doit être uniquement l'extension de ton fichier)
fic_wav=`echo $i | sed 's/mp3/wav/'`

n°720220
potiron51
Posté le 23-08-2005 à 11:01:13  profilanswer
 

ou pour s'assurer que la chaîne est bien en fin de nom de fichier, est-ce que fic_wav=`echo $i | sed 's/mp3$/wav/'` ne marcherait pas ?

n°720223
jlighty
Posté le 23-08-2005 à 11:07:12  profilanswer
 

normalement oui ta regexp indique qu'il faut remplacer le motif mp3 situé en fin de chaine (d'où le $) par wav.

n°720230
Xavier_OM
Monarchiste régicide (fr quoi)
Posté le 23-08-2005 à 11:12:59  profilanswer
 

ah oué pas con, en changeant l'extension avec sed on est sur que le reste ne change pas.... joli  :jap:


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
n°720239
jlighty
Posté le 23-08-2005 à 11:20:12  profilanswer
 

Oui c'est assez simple car tu ne changes pas de répertoire, dans le cas contraire il y aurait fallu différencier le nom du fichier avec son chemin

n°720244
Xavier_OM
Monarchiste régicide (fr quoi)
Posté le 23-08-2005 à 11:24:28  profilanswer
 

Je cite Yéti, un ami-gourou qui me répond par mail :
 
>
>C tout bête qd on sait que le résultat de la commande entre les backticks va être interprété (word-split notamment)...
>Pour l'éviter, faut le quoter:      
>       cp "$i" "`basename "$i" .mp3`".wav
>
>
>Mais, au passage, c'est pas portable...
>Le mieux est de mettre le résultat des backticks dans une variable, car là y'aura pas >word-split du résultat.
>      r=`basename "$i" .mp3`
>Mais à l'utilisation de la variable, il faut les mettre, car là y'aurait:
>      cp "$i" "$r.wav"
>
>Plus d'info sur les shells scripts portables (bon niveau en shell scripting recommandé):
> http://www.gnu.org/software/autoco [...] tml#SEC119
 
 
Bon ben on peut considérer le problème comme résolu :D


Message édité par Xavier_OM le 23-08-2005 à 11:28:18

---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
n°720274
black_lord
Modérateur
Truth speaks from peacefulness
Posté le 23-08-2005 à 11:54:13  profilanswer
 

après il y a la solution crade de modifier l'IFS


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
n°720281
[Albator]
MDK un jour, MDK toujours !
Posté le 23-08-2005 à 12:11:06  profilanswer
 

$ for i in *.mp3
> do  
> cp "$i" `basename "$i" .mp3`.wav
> done


 
Tu y étais presque, mais il manque encore des guillemets ...
 

$ for i in *.mp3
> do  
> cp "$i" "`basename \"$i\" .mp3`".wav
> done

n°1244162
graignla
once again
Posté le 17-10-2010 à 19:01:11  profilanswer
 

# touch un
# touche "deux trois"
# touch "deux trois"
# touch "quatre cinq six"
# ll
drwxr-xr-x    2 admin    administ     4.0k Oct 17 18:24 ./
drwxrwxrwx    7 laurent  everyone     4.0k Oct 17 18:23 ../
-rw-r--r--    1 admin    administ        0 Oct 17 18:24 deux trois
-rw-r--r--    1 admin    administ        0 Oct 17 18:24 quatre cinq six
-rw-r--r--    1 admin    administ        0 Oct 17 18:24 un
# for i *
# for I in *
> do
> echo $I
> done
deux trois
quatre cinq six
un
# for I in *; do touch "$I".ext ; done
# ll
drwxr-xr-x    2 admin    administ     4.0k Oct 17 18:26 ./
drwxrwxrwx    7 laurent  everyone     4.0k Oct 17 18:23 ../
-rw-r--r--    1 admin    administ        0 Oct 17 18:24 deux trois
-rw-r--r--    1 admin    administ        0 Oct 17 18:26 deux trois.ext
-rw-r--r--    1 admin    administ        0 Oct 17 18:24 quatre cinq six
-rw-r--r--    1 admin    administ        0 Oct 17 18:26 quatre cinq six.ext
-rw-r--r--    1 admin    administ        0 Oct 17 18:24 un
-rw-r--r--    1 admin    administ        0 Oct 17 18:26 un.ext
 
Pour une utilisation des noms de fichier en argument de script : les encadrer avec des ".
Si on utilise * en argument du script, il faudra les rappeler avec "$@" et non $*, car:
"$@" = "$1" "$2" "$3" etc... ce qui sépare clairement les noms de fichiers
alors que
$* = $1 $2 $3 etc..  amène une confusion entre les espaces des noms de fichiers et les séparateurs.

mood
Publicité
Posté le 17-10-2010 à 19:01:11  profilanswer
 

n°1245727
twocats
Posté le 23-10-2010 à 18:07:33  profilanswer
 

5 ans... Beau déterrage de topic !

n°1245777
cycojesus
Mèo Lười
Posté le 24-10-2010 à 19:35:38  profilanswer
 

et pas une fois la bonne solution :

$ for i in *.mp3  
> do    
> cp "$i" "${i%mp3}wav"
> done

:o


---------------
Chết rồi ! ✍ ⌥⌘ http://github.com/gwenhael-le-moine/slackbuilds/

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  [RESOLU] Shell script, espaces et noms de fichiers

 

Sujets relatifs
Proftpd et droits sur les fichiers[Resolu] Linux ne demarre pas sur un Athlon XP-M 2600+
probleme partage fichiersshell script probleme avec su
installation fluxbox [ résolu ]problème driver ati [résolu]
[résolu] [KDE] appercu des videos dans konquerorScript Unix
[Résolu] Sauvegarde d'un disque dur sur le point de lacher 
Plus de sujets relatifs à : [RESOLU] Shell script, espaces et noms de fichiers


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR