Shell script, espaces et noms de fichiers [RESOLU] - Codes et scripts - Linux et OS Alternatifs
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/'`
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 ?
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.
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
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
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
Marsh Posté le 23-08-2005 à 11:54:13
après il y a la solution crade de modifier l'IFS
Marsh Posté le 23-08-2005 à 12:11:06
$ for i in *.mp3 |
Tu y étais presque, mais il manque encore des guillemets ...
$ for i in *.mp3 |
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.
Marsh Posté le 24-10-2010 à 19:35:38
et pas une fois la bonne solution :
$ for i in *.mp3 |
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é
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.