alexmirage Posté(e) le 13 février 2014 Partager Posté(e) le 13 février 2014 Bonjour, Je suis entrain d'écrire un ptit script pour deplacer mes dossier en fonction d'un choix utilisateur. Malheureusement, je ne comprends pas pourquoi lorsque je fais le read Typ , aucun prompt n'apparait et ce meme en mettant read -p J'ai déjà testé plusieurs synthaxes différentes sans succès Alors ma question est : Est ce que le while read line pose probleme dans ce genre de fonction ? ou est-ce moi qui ai tout simplement oublié quelque chose ? find $chemin/* -name "*" -type d | while read line do echo $line read Typ "you must specified a type=1,2,3,4(1:video,2:music,3:archive,4:others) for $line" if [[ "$Typ" == "1" ]] then echo type=$typ item=$item movelocation=$video #mv $item $video echo "mv $item $video elif [[ "$Typ" == "2" ]] then echo type=$typ item=$item movelocation=$music #mv $item $music elif [[ "$Typ" == "3" ]] then echo type=$typ item=$item movelocation=$archive #mv $item $archive elif [[ "$Typ" == "4" ]] then echo type=$typ item=$item movelocation=$others #mv $item $others fi done Merci d'avance pour votre aide Alex Lien vers le commentaire Partager sur d’autres sites More sharing options...
Fravadona Posté(e) le 13 février 2014 Partager Posté(e) le 13 février 2014 (modifié) Ton plus gros souci est le pipe "|" qui empeche l'input utilisateur. Voici une maniere de faire: #!/bin/sh oIFS="$IFS" IFS=" " for line in `find * -type d -print` do echo -n "'$line' ? (v:video,m:music,a:archive,o:others) : " read -n 1 type echo case $type in v|V) echo "'$line' -> video" ;; m|M) echo "'$line' -> music" ;; a|A) echo "'$line' -> archive" ;; o|O) echo "'$line' -> others" ;; *) echo "Error: unknown type '$type'" ;; esac done Modifié le 13 février 2014 par Fravadona 1 Lien vers le commentaire Partager sur d’autres sites More sharing options...
alexmirage Posté(e) le 13 février 2014 Auteur Partager Posté(e) le 13 février 2014 (modifié) Super Merci pour ce feedback je me doutais bien qu'il y avait un probleme avec ce "| while read line" Donc si je suis ton raisonnement Je pourrais simplement faire : while read line do echo $line read Typ "you must specified a type=1,2,3,4(1:video,2:music,3:archive,4:others) for $line" if [[ "$Typ" == "1" ]] then echo type=$typ item=$item movelocation=$video #mv $item $video echo "mv $item $video elif [[ "$Typ" == "2" ]] then echo type=$typ item=$item movelocation=$music #mv $item $music elif [[ "$Typ" == "3" ]] then echo type=$typ item=$item movelocation=$archive #mv $item $archive elif [[ "$Typ" == "4" ]] then echo type=$typ item=$item movelocation=$others #mv $item $others fi done < find $chemin/* -name "*" -type d NB: $item == $line Par contre j'ai une autre question, quel est l'interet de IFS ici ? Bien à toi Modifié le 13 février 2014 par alexmirage Lien vers le commentaire Partager sur d’autres sites More sharing options...
Fravadona Posté(e) le 13 février 2014 Partager Posté(e) le 13 février 2014 (modifié) Penses a bien proteger tes $line avec des guillemets lors des mv "$line" "$others" pour eviter que tes repertoires avec des espaces dans le nom ne fassent faire n'importe quoi a mv Modifié le 13 février 2014 par Fravadona 1 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Fravadona Posté(e) le 13 février 2014 Partager Posté(e) le 13 février 2014 Par contre j'ai une autre question, quel est l'interet de IFS ici ? L'IFS defini comme saut de ligne permet au for de reconnaitre une ligne plutot qu'un mot : Sans cette definition alors par exemple /volume1/partage/Mes videos/Ski 2014 serait traite comme suit : /volume1/partage/Mes videos/Ski 2014 1 Lien vers le commentaire Partager sur d’autres sites More sharing options...
alexmirage Posté(e) le 13 février 2014 Auteur Partager Posté(e) le 13 février 2014 Haaaaa nickel car au debut j'ai essayé avec un For mais j'avais le prob des noms de dossiers avec espaces ... C'est pour ca que j'ai remplacé par un while En tout cas un grand merci Rapide et éfficace Rien à dire Lien vers le commentaire Partager sur d’autres sites More sharing options...
Fravadona Posté(e) le 13 février 2014 Partager Posté(e) le 13 février 2014 De rien NB: Le "<" en fin de commande permet de rediriger le contenu d'un fichier vers l'entree standard (et non a executer une commande comme tu voulais le faire dans ton deuxieme exemple) Lien vers le commentaire Partager sur d’autres sites More sharing options...
alexmirage Posté(e) le 13 février 2014 Auteur Partager Posté(e) le 13 février 2014 Oui je m'en suis rendu compte j'ai donc fait comme ceci #!/bin/sh ######################################################## # # description: This script is to dispatch files/folders # in right place # ######################################################## # Date | UserId | Description # --------------+---------+----------------------------- # 05-02-2014 | i24246 | First version ######################################################## #set -x if [ "$1" = "" ] then echo "you must specify an extension or a list of extensions to continue" echo "you can use for example a parameter file" exit fi mkdir /volume1/video/tri chmod -R 777 /volume1/video/* video=/volume1/video/tri/video music=/volume1/video/tri/music archive=/volume1/video/tri/archive others=/volume1/video/tri/others extensions=`cat $1` mkdir $video $music $archive $others chemin=/volume1/video/telechargements ###########MODULE DOSSIER################# oIFS="$IFS" IFS=" " for line in `find $chemin/* -name "*" -type d` do echo ===================================================================================== echo $line ls "$line" echo -n "you must specified a category for folder containing files =1,2,3,4,5(1:video,2:music,3:archive,4:others):" read -n 1 category if [[ "$category" == "1" ]] then mv "$line" "$video" elif [[ "$category" == "2" ]] then mv "$line" "$music" elif [[ "$category" == "3" ]] then mv "$line" "$archive" elif [[ "$category" == "4" ]] then mv "$line" "$others" fi done #####################MODULE FICHIERS############################## for ext in $extensions do case $ext in TORRENT|torrent|srt|SRT) find $chemin -name "*.$ext" -exec mv "*.$ext" "$others" ‘{}’ ; ;; RAR|rar|zip|ZIP|ISO|iso|Iso|Zip|Rar) find $chemin -name "*.$ext" -exec mv "*.$ext" "$archive" ‘{}’ ; ;; WAV|wav|MP3|mp3|Mp3|Wav) find $chemin -name "*.$ext" -exec mv "*.$ext" "$music" ‘{}’ ; ;; WMV|wmv|Wmv|AVI|avi|Avi|MP4|mp4|Mp4|MKV|mkv|Mkv) find $chemin -name "*.$ext" -exec mv "*.$ext" "$video" ‘{}’ ; esac done Bon c'est pas ce qu'on fait de plus optimisé mais cela fait ce que je veux Encore un tout grand merci Lien vers le commentaire Partager sur d’autres sites More sharing options...
Fravadona Posté(e) le 13 février 2014 Partager Posté(e) le 13 février 2014 Je ne pense pas que les commandes find de la fin vont faire ce que tu voudrais : for ext in $extensions do case $ext in [tT][oO][rR][rR][eE][nN][tT]|[sS][rR][tT]) dest="$others" ;; .... .... esac find "$chemin" -name "*.$ext" -exec mv {} "$dest/" ; done Lien vers le commentaire Partager sur d’autres sites More sharing options...
alexmirage Posté(e) le 13 février 2014 Auteur Partager Posté(e) le 13 février 2014 En effet cela ne fonctionne pas ... Mais en testant ta fonction, j'ai aussi un do unexpected for ext in $extensions do case $ext in [tT][oO][rR][rR][eE][nN][tT]) dest="$others" ;; [sS][rR][tT]|[aA][vV][iI]|[mM][oO][vV]|[mM][kK][vV]|[mM][pP]["4"]|[wW][mM][vV]|[mM]["4"][vV]) dest="$video" ;; [mM][pP][3]|[wW][aA][vV]|[aA][aA][cC]) dest="$music" ;; [zZ][iI][pP]|[rR][aA][rR]|[iI][sS][oO]) dest="$archive" ;; esac find "$chemin" -name "*.$ext" -exec mv {} "$dest/" ; done exit test3.sh: line 2: syntax error: unexpected word (expecting "do") Sans doute le case qui fait des siennes les "4" qui passent peut être mal Lien vers le commentaire Partager sur d’autres sites More sharing options...
Fravadona Posté(e) le 13 février 2014 Partager Posté(e) le 13 février 2014 #!/bin/sh extensions="mp4 toRrent MkV Zip Wav mP3 m4V" for ext in $extensions do case $ext in [tT][oO][rR][rR][eE][nN][tT]) dest="others" ;; [sS][rR][tT]|[aA][vV][iI]|[mM][oO][vV]|[mM][kK][vV]|[mM][pP]4|[wW][mM][vV]|[mM]4[vV]) dest="video" ;; [mM][pP]3|[wW][aA][vV]|[aA][aA][cC]) dest="music" ;; [zZ][iI][pP]|[rR][aA][rR]|[iI][sS][oO]) dest="archive" ;; esac echo "$ext" -> "$dest/" #find "$chemin" -name "*.$ext" -exec mv {} "$dest/" ; done exit 1 Lien vers le commentaire Partager sur d’autres sites More sharing options...
alexmirage Posté(e) le 14 février 2014 Auteur Partager Posté(e) le 14 février 2014 Super merci ... Mais question , as-tu testé chez toi ? je soupçonne que oui mais je me demandais si c'était sur ton nas ? Car j'ai toujours la même réponse /volume1/video $ sh test.sh : not foundline 13: test4.txt: line 31: syntax error: unexpected word (expecting "do") je vais continuer a chercher car pour l'instant tu m'as bien maché le travaille Bonne journée Lien vers le commentaire Partager sur d’autres sites More sharing options...
alexmirage Posté(e) le 14 février 2014 Auteur Partager Posté(e) le 14 février 2014 Ca va j 'ai résolu le soucis Des caractères spéciaux s'étaient glissés dans le code Je ferme le sujet Bien à toi Alex Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés