Problèmes caractères spéciaux avec la commande find shell

Résolu/Fermé
Arasas Messages postés 4 Date d'inscription mardi 2 juin 2015 Statut Membre Dernière intervention 4 juin 2015 - Modifié par Arasas le 2/06/2015 à 10:44
Malekal_morte- Messages postés 180304 Date d'inscription mercredi 17 mai 2006 Statut Modérateur, Contributeur sécurité Dernière intervention 15 décembre 2020 - 2 juin 2015 à 11:09
Bonjour Tout le monde,

Alors voila j'explique mon problème je suis en train d'écrire un script sous Linux qui va me permettre de déplacer des fichiers pdf dans un repertoire en fonction de leur nom.
Problème: j'ai créé une variable contenant le chemin où se trouvent les fichiers. Le nom de ce répertoire est "REPRISE D'ARCHIVES". J'ai donc utilisé les caractères d'échappement pour que le script prenne en compte l'apostrophe et l'espace...
dossier_source=/root/TEST/REPRISE\ D\'ARCHIVES

Mais lorsque je réutilise cette variable dans ma commande find:
find $dossier_source -maxdepth 1 \( -name "$nom_fichier_pdf" -o -name "$nom_fichier_csv" \) -type f -exec mv -vu {} $dossier_dest \;

Il m'affiche ceci lors du traitement:
find: /root/TEST/REPRISE: Aucun fichier ou répertoire de ce type
find: D'ARCHIVES: Aucun fichier ou répertoire de ce type

J'ai fait un test en faisant un echo de ma variable dossier_source, il m'affiche bien ce que je veux:
echo "$dossier_source"
Résultat: /root/TEST/REPRISE D'ARCHIVES

Le plus étonnant c'est que si je n'utilise pas ma variable dossier_source dans mon find et que je rentre le chemin en dur eh bien il est content alors je ne comprends pas. Avec ceci ça marche:
find /root/TEST/REPRISE\ D\'ARCHIVES -maxdepth 1 \( -name "$nom_fichier_pdf" -o -name "$nom_fichier_csv" \) -type f -exec mv -vu {} $dossier_dest \;

Voila voila aidez mois svp je suis totalement coincé
Merci d'avance
A voir également:

1 réponse

Malekal_morte- Messages postés 180304 Date d'inscription mercredi 17 mai 2006 Statut Modérateur, Contributeur sécurité Dernière intervention 15 décembre 2020 24 628
Modifié par Malekal_morte- le 2/06/2015 à 10:49
Salut,

Parce que le séparateur de la boucle for est un espace.
Avec while, ça aurait fonctionné.

Je pense que la réponse t'est donnée par jipicy dans ce post : https://forums.commentcamarche.net/forum/affich-3968147-shell-probleme-avec-boucle-find-et-espaces

Ca marche comme tu le dis :
malekalmorte@Mak-tux:/tmp$ nom_fichier_pdf=bla.pdf ; find /tmp/REPRISE\ D\'ARCHIVES -maxdepth 1 \( -name "$nom_fichier_pdf" -o -name "$nom_fichier_csv" \) -type f -exec mv -vu {} /tmp \; 
« /tmp/REPRISE D'ARCHIVES/bla.pdf » -> « /tmp/bla.pdf »


ca marche PAS comme tu le dis :
malekalmorte@Mak-tux:/tmp$ nom_fichier_pdf=bla.pdf ; dossier_source="REPRISE\ D\'ARCHIVES"  ; find ${dossier_source} -maxdepth 1 \( -name "$nom_fichier_pdf" -o -name "$nom_fichier_csv" \) -type f -exec mv -vu {} /tmp \; 
find: "'REPRISE\\": Aucun fichier ou dossier de ce type
find: "D\\'ARCHIVES'": Aucun fichier ou dossier de ce type


Ca a l'air de marcher comme jipicy l'explique :
malekalmorte@Mak-tux:/tmp$ nom_fichier_pdf=bla.pdf ; IFS=$'\n' ; dossier_source="REPRISE D'ARCHIVES"  ; find ${dossier_source} -maxdepth 1 \( -name "$nom_fichier_pdf" -o -name "$nom_fichier_csv" \) -type f -exec mv -vu {} /tmp \; 
« REPRISE D'ARCHIVES/bla.pdf » -> « /tmp/bla.pdf »




Like the angel you are, you laugh creating a lightness in my chest,
Your eyes they penetrate me,
(Your answer's always 'maybe')
That's when I got up and left
1
Arasas Messages postés 4 Date d'inscription mardi 2 juin 2015 Statut Membre Dernière intervention 4 juin 2015
2 juin 2015 à 10:56
ca marche ! merci beaucoup malekal_morte !
0
Malekal_morte- Messages postés 180304 Date d'inscription mercredi 17 mai 2006 Statut Modérateur, Contributeur sécurité Dernière intervention 15 décembre 2020 24 628
2 juin 2015 à 11:09
Pas de problème =)
0