Bonjour,
Mon souci est simple, voici un script que j'ai fait, pour récupérer le nom d'un répertoire de montage de mon appareil photo qui est différent à chaque montage:
#/bin/bash

dir=`find /home/famille/.gvfs/ -name "DCIM"`
Ensuite vous vous en doutez j'utilise cette variable pour faire différentes choses comme copier mes photos etc..

Pour vous donner une idée du nom de ce répertoire, quand je tape ma commande dans un terminal voilà ce que j'ai:
$ find /home/famille/.gvfs/ -name "DCIM"
/home/famille/.gvfs/Montage de gphoto2 sur usb%3A001,024/DCIM
Mon script fonctionne très bien quand je l'exécute directement depuis le terminal, mais je l'ai placé sur le bureau, et si lorsque je double clique dessus je choisi "executer dans un terminal" il ne fonctionne pas et pour cause voilà ce qu'il me donne..
find: "/home/famille/.gvfs/Mo": Aucun fichier ou dossier de ce type
find: "tage de gphoto2 sur usb%3A001,024/DCIM": Aucun fichier ou dossier de ce type
Ma variable a été tronqué une idée du pourquoi du comment ?


pour info voici mon script général :
#/bin/bash

directory=`find /home/famille/.gvfs/ -name "DCIM"`

#dir=/home/famille/Desktop/test\ en\ espace/
list=`IFS=$'\n' && find $directory -name "*.JPG"`




#---Test de connexion de l'appareil
IFS=$'\n' && if [ -e $directory ] ; then

#creation du dossier temporaire
mkdir ~/Desktop/photo-temporaires;
zenity --info --timeout=5 --text "Attends que les Photos se copient et que des fenêtres s'affichent"
#--Copie des fichiers

for i in $list ; do 
cp $i ~/Desktop/photo-temporaires;
done



#ouverture des deux fenêtres
nautilus ~/Desktop/photo-temporaires;
nautilus ~/Documents/Mes\ documents/Photo/

sleep 1;
#--suppression du dossier sur l'appareil photo
zenity --question --text "Tu veux supprimer les photos de l'Appereil ?";
if [ $? == 0 ] ;
then 
rm -r $directory;
fi

else

#---l'appareil photo n'est pas monté
zenity --info --text "L'appareil photo n'est pas connecté ou pas allumé";
fi
Merci à Levi59 (sur le fofo d'Ubuntu) c'est le \n en fait le find ne voit que "n" et le considère comme caractère de séparation, il faut donc faire avant
IFS="
" #avec un vrai retour à la ligne
Je précise que changer l'IFS me permet d'utiliser des répertoires composés d'espaces..
merci encore
Bonjour,

Si tu rajoutes des " autour de la variable qui contient un espace lorsque tu l'utilises, ça fonctionne ?
…
list=`IFS=$'\n' && find "$directory" -name "*.JPG"`
…
PS : pour voir plein de choses en bash http://tldp.org/LDP/abs/html/
non cela ne change rien les guillemets ne modifient en rien l'IFS et à chaque espace la commande prendra ça pour un argument de plus. on peut modifier avec sed les espaces aussi, mais la technique de l'IFS fonctionne bien
titimoi wrote:non cela ne change rien les guillemets ne modifient en rien l'IFS et à chaque espace la commande prendra ça pour un argument de plus. on peut modifier avec sed les espaces aussi, mais la technique de l'IFS fonctionne bien
Il faut juste penser à restaurer la valeur de l'IFS après la commande qui nécessite modification.
Sinon on s'expose à des comportements qui peuvent sembler bizarroïdes.
avec print0 de find tu peux matcher les noms avec espaces
bon en fait non c'est pas résolu, j'ai testé pas mal de choses et je commence à plus savoir où est le problème. En changeant l'IFS c'est mon cp qui n'y voit plus rien et pense que chaque espace est un nouveau fichier maintenant, je regarde avec print0 de find mais c'est pas simple, je regarde du côté de sed également...
Pas besoin de modifier la variable IFS :
Voici un exemple de script :
$ cat f.sh 
#!/bin/bash
# inits
repertoire="Repertoire avec espace"
repertoireTmp1="/tmp/repertoireTmp1"
repertoireTmp2="/tmp/repertoireTmp2"
fichier1="Fichier1 avec espace.txt"
fichier2="Fichier2 avec espace.txt"

# nettoyage
rm -rf "${repertoire}"
rm -rf "${repertoireTmp1}"
rm -rf "${repertoireTmp2}"

# creation cas de test
mkdir -p "${repertoire}"
touch "${repertoire}"/"${fichier1}"
touch "${repertoire}"/"${fichier2}"
mkdir -p "${repertoireTmp1}"
mkdir -p "${repertoireTmp2}"
tree "${repertoire}"
echo ""

# solution 1
find "${repertoire}" -name "*.txt" -exec cp {} "${repertoireTmp1}" \;
tree "${repertoireTmp1}"
echo ""

# solution 2
find "${repertoire}" -name "*.txt" -print0 | xargs -0 cp -t "${repertoireTmp2}"
tree "${repertoireTmp2}"
echo ""


Et son exécution :
$ ./f.sh 
Repertoire avec espace
├── Fichier1 avec espace.txt
└── Fichier2 avec espace.txt

0 directories, 2 files

/tmp/repertoireTmp1
├── Fichier1 avec espace.txt
└── Fichier2 avec espace.txt

0 directories, 2 files

/tmp/repertoireTmp2
├── Fichier1 avec espace.txt
└── Fichier2 avec espace.txt

0 directories, 2 files
Merci pour cette réponse, je ne suis plus sur le c sur lequel j'avais le script mais je teste ça dès que possible. Merci