[RESOLU] Shell script, espaces et noms de fichiers

Shell script, espaces et noms de fichiers [RESOLU] - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 23-08-2005 à 10:18:53    

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

Marsh Posté le 23-08-2005 à 10:18:53   

Reply

Marsh Posté le 23-08-2005 à 10:44:22    

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/'`

Reply

Marsh Posté le 23-08-2005 à 11:01:13    

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 ?

Reply

Marsh Posté le 23-08-2005 à 11:07:12    

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

Reply

Marsh Posté le 23-08-2005 à 11:12:59    

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

Marsh Posté le 23-08-2005 à 11:20:12    

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

Reply

Marsh Posté le 23-08-2005 à 11:24:28    

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

Marsh Posté le 23-08-2005 à 11:54:13    

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
Reply

Marsh Posté le 23-08-2005 à 12:11:06    

$ 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

Reply

Marsh Posté le 17-10-2010 à 19:01:11    

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

Reply

Marsh Posté le 17-10-2010 à 19:01:11   

Reply

Marsh Posté le 23-10-2010 à 18:07:33    

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

Reply

Marsh Posté le 24-10-2010 à 19:35:38    

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/
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed