Aller au contenu

Messages recommandés

Posté(e)

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

Posté(e) (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é par Fravadona
Posté(e) (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é par alexmirage
Posté(e) (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é par Fravadona
Posté(e)

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

Posté(e)

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 :)

Posté(e)

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)

Posté(e)

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

Posté(e)

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
Posté(e)

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
Posté(e)
#!/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
Posté(e)

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
Posté(e)

Ca va j 'ai résolu le soucis

Des caractères spéciaux s'étaient glissés dans le code :P

Je ferme le sujet

Bien à toi

Alex

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.