Aller au contenu

Script Sh Read Problem


Messages recommandés

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

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é par Fravadona
Lien vers le commentaire
Partager sur d’autres sites

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é par alexmirage
Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

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

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 :P
les "4" qui passent peut être mal
Lien vers le commentaire
Partager sur d’autres sites

#!/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
Lien vers le commentaire
Partager sur d’autres sites

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

Invité
Ce sujet ne peut plus recevoir de nouvelles réponses.
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.