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

Résolu
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. Contributeur
    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
    
    1. cette solution me semble un poil plus elegeante que celle de charSniper, je vais donc l'adopter !
      merci à tous pour votre aide !
  2. Contributeur
    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.
    1. 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.
    2. Contributeur
      à 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.
  3. Contributeur
    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