[shell] Tri de fichiers avec extensions

Bonjour à tous !

J'ai besoin d'écrire un script shell permettant de trier des fichiers suivant leur extension et de les déplacer dans un dossier créé par mes soins.
Le dossier rep_text est censé contenir à la fin de l'éxécution du bash tous les fichiers .txt du répertoire d'où a été lancé le script.

Je vous met mon travail car le script me déplace tout le dossier script (d'où est lancé le script) au lieu des fichiers en eux-même.

Si quelqu'un aurait l'obligence de m'expliquer pourquoi mon script ne fait pas ce que je demande, merci d'avance.

Le script est exécuté à partir du dossier : /home/bandit/Script/

Script :

#!/bin/sh
if [ ! -d /home/bandit/test_script ]
then
mkdir /home/bandit/test_script
mkdir /home/bandit/test_script/rep_text
mkdir /home/bandit/test_script/rep_mp3
mkdir /home/bandit/test_script/rep_tmp
fi

txt= find *.txt
mp3= find *.mp3
tmp= find *.tmp

val="/home/bandit/Script/"

echo "$txt"
echo "$mp3"
echo "$tmp"
cd ..

mv "/home/bandit/Script/$txt" /home/bandit/test_script/rep_text/
#mv $val$mp3 $val
#mv /home/bandit/Script/$tmp /home/bandit/test_script/rep_tmp

4 réponses

  • Votes
  • Date
  • Date décroissante
  1. Contributeur
    Salut,
    Question sans doute très con :)

    Pourquoi tu ne fais pas :

    mv /home/bandit/Script/*.txt /home/bandit/test_script/rep_text/


    ?

    J'avais prévenu :)
    1. Modérateur
      Salut,

      teebo => C'est pas con, c'est la logique même ;-))

      fozzy => Tes variables, déjà faut les encadrer avec des guillemets puisqu'elles contiennent des espaces (txt="find *.txt"), ensuite puisqu'elles contiennent une commande, il vaut mieux les écrire comme suit :
      txt="$(find *.txt)"
      ;-))
      1. Bah tout simplement parce que je n'y ai pas pensé oh la honte MDR !

        Maintenant tout fonctionne évidemment 8-)

        Bon je sors MDR

        Merci Thibault ta question m'a ouvert les yeux 8-)

        #!/bin/sh
        if [ ! -d /home/bandit/test_script ]
        then
        mkdir /home/bandit/test_script
        mkdir /home/bandit/test_script/rep_text
        mkdir /home/bandit/test_script/rep_mp3
        mkdir /home/bandit/test_script/rep_tmp
        fi

        mv /home/bandit/Script/*.txt /home/bandit/test_script/rep_text/
        mv /home/bandit/Script/*.mp3 //home/bandit/test_script/rep_mp3
        mv /home/bandit/Script/*.tmp /home/bandit/test_script/rep_tmp
        1. Salut!
          Ton shell script ma bien aidé, j'avais essayer de faire au moins aussi compliquer que toi ^^
          Maintenant j'ai une question, par exemple j'ai motion (capture webcam) qui crée des photos avec la date dedans mais il n'y a pas que la date et j'aimerais savoir si il est possible de par exemple lire qu'a partir du deuxieme caractere pour x caracteres je pense que c'est possible mais je n'ai aucune idée!et donc en fait je ferais le tri des dossiers par date merci!
        2. Modérateur
          @FlowSalut,

          Regarde du côté de la commande sort (man sort) et de la syntaxe du genre :
          sort -t FS +CHAMP -k POS
          ou FS est le caractère séparateur de champs, CHAMP (un numéro) le champ à prendre en compte pour le tri et POS (un numéro aussi) le nième caractère à prendre à compte...

          ;-))
        3. @jipicyeuh c'est un peu confus pour moi l'histoire du champ??
          en fait les fichiers sortis sont de se style:
          09-20070804114231.avi ou .jpg
          donc en fait ce qui m'interesse ici c'est la date 20070804 j'aimerais l'isoler dans une variable pour faire la recherche par jour et dans le dossier de nom 04/08/2007 refaire la meme chose pour les photos pour chaques heures merci :)
      2. Modérateur
        Salut,

        voici quelques commandes qui peut être pourront t'aider
        lami20j@deb:~/trash$ ls -1 *.avi
        09-20070804114231.avi
        09-20070805114231.avi
        09-20070806114231.avi
        09-20070807114231.avi
        09-20070812114231.avi
        09-20070816114231.avi
        lami20j@deb:~/trash$ ls -1 *.avi | sort --key=4,8
        09-20070804114231.avi
        09-20070805114231.avi
        09-20070806114231.avi
        09-20070807114231.avi
        09-20070812114231.avi
        09-20070816114231.avi
        lami20j@deb:~/trash$ ls -1 *.avi | grep -Eo '[0-9]{8}'
        20070804
        20070805
        20070806
        20070807
        20070812
        20070816
        
        1. Merci beaucoup l'ami c'est justement ce que je voulais :)
          Bonne journée ;)