[shell] problème avec boucle find et espaces
Vic
-
vic007 -
vic007 -
Bonjour,
Petit soucis avec un script (qui doit remplacer le caractère  par _ dans tous les noms de fichier .jpg des sous répertoires du répertoire courant... pfiou !):
En fait, le soucis que j'ai, c'est que à un moment (peut-être dans le find), les noms des fichiers et des répertoires sont décomposés car ils contiennent des espaces et le shell me sort ca :
Ca doit être bien facile à trouver, mais la... je bloque :(
QUelqu'un peut-il m'éclairer?
Merci d'avance!
Petit soucis avec un script (qui doit remplacer le caractère  par _ dans tous les noms de fichier .jpg des sous répertoires du répertoire courant... pfiou !):
for f in `find . -type f -name "*.jpg" `; do mv -T "$f" "${f/Â/_}" done
En fait, le soucis que j'ai, c'est que à un moment (peut-être dans le find), les noms des fichiers et des répertoires sont décomposés car ils contiennent des espaces et le shell me sort ca :
mv: ne peut évaluer `./300': Aucun fichier ou répertoire de ce type mv: ne peut évaluer `de': Aucun fichier ou répertoire de ce type mv: ne peut évaluer `Frank': Aucun fichier ou répertoire de ce type mv: ne peut évaluer `Miller': Aucun fichier ou répertoire de ce type mv: ne peut évaluer `2007/300': Aucun fichier ou répertoire de ce type mv: ne peut évaluer `Comic': Aucun fichier ou répertoire de ce type mv: ne peut évaluer `Con': Aucun fichier ou répertoire de ce type mv: ne peut évaluer `2006/300Comicon_044.jpg': Aucun fichier ou répertoire de ce type mv: ne peut évaluer `./300': Aucun fichier ou répertoire de ce type mv: ne peut évaluer `de': Aucun fichier ou répertoire de ce type mv: ne peut évaluer `Frank': Aucun fichier ou répertoire de ce type mv: ne peut évaluer `Miller': Aucun fichier ou répertoire de ce type
Ca doit être bien facile à trouver, mais la... je bloque :(
QUelqu'un peut-il m'éclairer?
Merci d'avance!
A voir également:
- [shell] problème avec boucle find et espaces
- Espaces insécables - Guide
- Classic shell - Télécharger - Personnalisation
- Find and mount - Télécharger - Récupération de données
- Tapez cette phrase, en respectant bien les espaces et la ponctuation. - Guide
- Find grep ✓ - Forum Linux / Unix
14 réponses
Salut,
En fait oui c'est bien une histoire d'espace, dû non pas à la commande "find" mais à la boucle "for" et plus particulièrement à la valeur de la variable d'environnement "$IFS" (Input Field Separator), qui par défaut a pour valeur l'espace et tabulation et à qui il faut assigner la valeur "saut de ligne" (\n) :
Sinon une autre façon de faire est passer par une boucle "while", voir à ce sujet cette astuce dans la FAQ.
;-))
En fait oui c'est bien une histoire d'espace, dû non pas à la commande "find" mais à la boucle "for" et plus particulièrement à la valeur de la variable d'environnement "$IFS" (Input Field Separator), qui par défaut a pour valeur l'espace et tabulation et à qui il faut assigner la valeur "saut de ligne" (\n) :
OLD_IFS="$IFS" IFS=$'\n' for f in $(find . -type f -name "*.jpg"=; do mv -T "$f" "${f/Â/_}" done IFS="$OLD_IFS"Devrait marcher bien mieux.
Sinon une autre façon de faire est passer par une boucle "while", voir à ce sujet cette astuce dans la FAQ.
;-))
Ah super ! Merci, je connaissais pas ça... enfin c'est pas étonnant, j'ai raté quelques cours de shell :p
Sinon j'ai un autre soucis du coup... j'aimerais remplacer le caractère ° par _ dans ma boucle précédente... mais on dirait que cela ne fonctionne pas, car aucun fichier n'est modifié... Pourtant j'utilise la même boucle :
Sinon j'ai un autre soucis du coup... j'aimerais remplacer le caractère ° par _ dans ma boucle précédente... mais on dirait que cela ne fonctionne pas, car aucun fichier n'est modifié... Pourtant j'utilise la même boucle :
for f in `find . -type f -name "*.jpg" `; do mv -T "$f" "${f/°/_}" done
En fait je dois être nouille mais cela ne marche pas :
Aucun fichier n'est modifié :(
Please help!!!
for f in `find . -type f -name "*.jpg" `; do mv -T "$f" "${f/\°/_}" done
Aucun fichier n'est modifié :(
Please help!!!
Attends là ! Faudrait qu'on se comprenne bien :-\
Le caractère " * " se trouve bien dans le nom de tes fichiers ? Ou tu me parles d'autre chose !?
Le caractère " * " se trouve bien dans le nom de tes fichiers ? Ou tu me parles d'autre chose !?
[tmpfs]$ var="mon * étoile" [tmpfs]$ echo "$var" mon * étoile [tmpfs]$ echo ${var/\*/_} mon _ étoile [tmpfs]$;-)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Arf désolé, problème d'affichage ;-((
Bon mais en fait ça change pas grand chose :
Bon mais en fait ça change pas grand chose :
[tmpfs]$ var="mon n° à moi" [tmpfs]$ echo ${var/°/_} mon n_ à moiSi tu as des problèmes, affiches un exemple avec ton code et l'erreur générée.
Et les noms de tes fichiers dans le répertoire ils ressemble à quoi ?
Affiche un listing s'il te plaît "ls -1" (c'est un 1 (chiffre un) et pas un L minuscule, hein ?)
Affiche un listing s'il te plaît "ls -1" (c'est un 1 (chiffre un) et pas un L minuscule, hein ?)
Jury_n_°001.jpg Jury_n_°002.jpg Jury_n_°003.jpg Jury_n_°004.jpg Jury_n_°005.jpg Jury_n_°006.jpg ... Jury_n_°021.jpg Jury_n_°022.jpg
Ben je comprends pas non plus ;-\
[tmpfs]$ touch Jury_n_°00{1,2,3,4,5}.jpg [tmpfs]$ ls -1 Jury_n_°001.jpg Jury_n_°002.jpg Jury_n_°003.jpg Jury_n_°004.jpg Jury_n_°005.jpg [tmpfs]$ for f in *; do mv "$f" ${f/°/_}; done [tmpfs]$ ls -1 Jury_n__001.jpg Jury_n__002.jpg Jury_n__003.jpg Jury_n__004.jpg Jury_n__005.jpg [tmpfs]$Essaie d'exécuter ton script en mode débogage, ajoute "set -xv" après la ligne "shebang" (#! /bin/bash) et essaie de repérer où ça coince...
Ce n'est pas la peine d'échapper le "°" (${f/\°/_}), ce n'est pas un méta-caractère du shell !
Il ne te renvoie que ça comme sortie le débogage ?
Il en manque là, non ?
Il ne te renvoie que ça comme sortie le débogage ?
Il en manque là, non ?
heu non rename ca va pas trop, car les noms de fichiers sont jamais idnetiques, à part dans cet exemple....
car les noms de fichiers sont jamais idnetiques, à part dans cet exemple
ben, justement, on peut utiliser les regex et c'est très puissant
si on reviens à ton problème de début remplacer le caractère  par _ dans tous les noms de fichier .jpg on aura ça
ben, justement, on peut utiliser les regex et c'est très puissant
si on reviens à ton problème de début remplacer le caractère  par _ dans tous les noms de fichier .jpg on aura ça
rename 's/\xC2/_/' *.jpg