[bash] script non fonctionnelle, mais pas d'e

Résolu
periplasme Messages postés 422 Statut Membre -  
Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour tout le monde,

voila, téléchargant beaucoup, je souhaitais automatiser la gestion des fichiers (les musiques dans music/, les ebooks dans ebooks/ ... ) bref, je suis pas über familier avec les script et je trouve pas où se trouve l'erreur ...
# les extensions  
tab="*.epub"  
tab[1]="*.pdf"  

tab[2]="*.mp3"  
tab[3]="*.ogg"  
tab[4]="*.wav"  

tab[5]="*.avi"  
tab[6]="*.mkv"  
tab[7]="*.mp4"  

# pour tout fichiers dans le répertoire courant, on verifie l'extension, et on range en conséquence.  
for ((i=0; i<=7; i++)) 
do 
    #epub et pdf 
    if test $i -le 1; then 
        find ./ -name tab[$i] -exec cp {} ebooks/  \; 
    else #mp3, ogg, et wav 
        if test $i -ge 2 && test $i -le 4; then 
        find ./ -name tab[$i] -exec cp {} music/ \; 
    else #avi, mkv, et mp4 
        if test $i -ge 5 && test $i -le 7; then 
        find ./ -name tab[$i] -exec cp {} movies/ \; 
    fi fi fi 
done 

            


bash ne me cri pas dessus, mais ne copie rien ...

une âme charitable pour m'expliquer mon erreur ?

3 réponses

  1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    !! attention, il me semble que le find va aussi descendre dans les répertoires ebooks music et movies et essayer de copier les fichiers sur eux-mêmes.

    on peut utiliser tab=(...) pour initialiser un tableau
    utiliser ${} avec les variables : ${tab[$i]}
    utiliser " pour le find -name à cause des *
    on peut connaitre la taille du tableau avec ${#tab[@]}
    #!/bin/bash  
    # les extensions    
    tab=("*.epub"  "*.pdf" "*.mp3" "*.ogg"  "*.wav"  "*.avi"  "*.mkv"  "*.mp4")    
    
    # pour tout fichiers dans le répertoire courant, on verifie l'extension, et on range en conséquence.    
    for ((i=0; i<=${#tab[@]}; i++))   
    do   
        #epub et pdf   
        if test $i -le 1; then   
            find ./ -name "${tab[$i]}" -exec cp {} ebooks/  \;   
        else #mp3, ogg, et wav   
            if test $i -ge 2 && test $i -le 4; then   
            find ./ -name "${tab[$i]}" -exec cp {} music/ \;   
        else #avi, mkv, et mp4   
            if test $i -ge 5 && test $i -le 7; then   
            find ./ -name "${tab[$i]}" -exec cp {} movies/ \;   
        fi fi fi   
    done   
    
    0
  2. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    Salut.
    Je ne sais pas trop ce qui merde dans ton script. Mais pourquoi faire compliquer quand on peut faire simple ?
    books="*.pdf *.epub"
    music="*.mp3 *.wav"
    video="*.avi *.mpeg"
    if ls $books
    then :
         cp $books ebooks
    fi
    if ls $music
    then :
         cp $music music/
    fi
    if ls $video
    then :
         cp $video movies/
    fi

    d'ailleurs, si tu veux ranger, tu devrais plutôt faire un mv qu'un cp.
    De toute les manières ta boucle est inutile, si tu veux vraiment le faire avec find, il y a moyen de lui passé plusieurs extension.
    0
    1. periplasme Messages postés 422 Statut Membre 53
       
      effectivement, cela me semble plus simple. je pense que j'ai voulu faire un poil trop compliqué ...

      ps : j'utilise cp pour "tester" avec de passer à mv, histoire d'eviter de potentiels erreurs.
      0
    2. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
       
      à mon avis ce n'est pas nécessaire. Regarde le man de mv, je pense qu'il y aura une option qui te conviendra pour tester.
      0
  3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

    Une autre possibilité :

    #!/bin/bash
    
    mkdir -p ebooks musics movies
    
    for fic in *
    do
    case "${fic##*.}" in
    epub|pdf)	cp -v "${fic}" ebooks/
    		;;
    mp3|ogg|wav)	cp -v "${fic}" musics/
    		;;
    avi|mkv|mp4)	cp -v "${fic}" movies/
    		;;
    *)		;;
    esac
    done
    
    0
    1. periplasme Messages postés 422 Statut Membre 53
       
      cette solution me semble un poil plus elegeante que celle de charSniper, je vais donc l'adopter !
      merci à tous pour votre aide !
      0