Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 02/04/2011, à 16:37

baba00000000

Partager un dossier en 2 ou 3 ou 4 (bash)

Bonjours à tous.

Je ne demande pas la réponse tout fait, je voudrais arrivé à le faire moi même. Mais peut être que c'est un peux difficile pour un débutant.

Dans un dossier j'ai par exemple 400 fichiers ( Dossier400 ).

Voilà ce que devrait faire mon bash: ( dans un premier moment on partage en 2, ça sera déjà pas mal big_smile )

A partir du Dossier400 je voudrais faire 2 Dossier200 ( 200 fichier dans l'un et pareil dans l'autre)
Le nombre peux être aléatoire ( pair ou impaire )

Les choses sans importance:
- non de fichier
- taille


Je pense que soit doit être possible. Et je demande un peux d'aide pour démarrer car je suis un peu perdu ( par exemple le nom de la commande et je fouillerais le man, ou un début de piste sur une page internet).
Je cherche avec différent mot sur internet mais sa réel succés, les moteurs de recherche sont loin de ce que je cherche.
Merci.


http://racketiciel.info

http://racketiciel.info/petition/ Pétition qui ferra peut être changé les installations sur les pc vendu en France.

Hors ligne

#2 Le 02/04/2011, à 17:33

pode

Re : Partager un dossier en 2 ou 3 ou 4 (bash)

Une simple boucle for sur l'ensemble des fichiers source associée à un "booléen" qui change de valeur à chaque passage dans la boucle for
Le résultat est le suivant (le contenu du script n'est pas montré) :

$ ./repartition.sh dossier dossier1 dossier2
Contenu initial du repertoire dossier
a  b  c  d  e  f  g  h    i
Contenu final du repertoire dossier1
a  c  e  g  i
Contenu final du repertoire dossier2
b  d  f  h

Hors ligne

#3 Le 02/04/2011, à 18:18

baba00000000

Re : Partager un dossier en 2 ou 3 ou 4 (bash)

Merci beaucoup, je me mets au travaille tout de suite.


http://racketiciel.info

http://racketiciel.info/petition/ Pétition qui ferra peut être changé les installations sur les pc vendu en France.

Hors ligne

#4 Le 03/04/2011, à 11:35

Levi59

Re : Partager un dossier en 2 ou 3 ou 4 (bash)

Une commande pour compter le nombre de fichier dans le dossier $DIR :

find $DIR -maxdepth 1 -type f | wc -l

Ça devrait te permettre de simplifier le code...


Edit :
Je me suis fait une petite version pour le fun. Ça sépare un dossier en deux dossier avec la moitié des fichiers dans chaque. Descend si ça t'intéresse de la voir.

#!/bin/bash
# script pour séparer un dossier en X dossiers avec le même nombre de fichiers (+/-1)
#
# Copyright (C) 03 Avr. 2011, Rombeaut Rodolphe
# http://scriptam.over-blog.com/
# Released into the public domain.
#

usage() {
echo "usage : $(basename $0) repertoire_source1 repertoire_source2 ... repertoire_sourceN "
exit 1
}

[[ $# -lt1 ]] && usage

for DIR in "$@"
do 
     [[ -d $DIR ]] || { 
        echo "Argument(s) non valide(s)"
        echo "$DIR n'est pas un dossier"
        exit
    }
done

while [ -z $DIVISEUR ]; do 
    echo "Diviser en combien de parties? " ; read NOMBRE 
    NOMBRE=$(( $NOMBRE/1 ))
    TEST=$?
    [ "$TEST" -eq 0 -a "$NOMBRE" -gt 0 ] && DIVISEUR=$NOMBRE || {
    echo "Nombre invalide"
    }
    echo "Division en $DIVISEUR partie(s) dans chaques dossiers, confirmer? (O/n)" ; read VALID
    [[ $VALID != [oO] ]] && exit
done

for DIR in "$@"
do 
    echo "$DIR :"
    NBRFILETOT=$(find "$DIR" -maxdepth 1 -type f | wc -l)
    [[ $NBRFILETOT -eq 0 ]] && {
        echo "Erreur, 0 fichier trouvé. Vous devez indiquer un dossier vide ou un raccourci... Indiquez un dossier contenant au moins $DIVISEUR fichiers ou utiliser le dossier de destination"
        exit 1
    }
    
    NBRFILE=$(( $NBRFILETOT/$DIVISEUR ))
    NBRFILE2=$NBRFILE
    DIR="$(dirname "$DIR")/$(basename "$DIR")"
    [[ $NBRFILE -lt $DIVISEUR ]] && {
        for ((  J = 1 ;  J <= $DIVISEUR;  J++  )); do
            [[ -d $DIR/$(basename "$DIR")$J ]] || mkdir "$DIR/$(basename "$DIR")$J"
        done
    } || {
        echo "Erreur, le dossier $DIR doit contenir au moins $DIVISEUR fichiers"
        exit 1
    }
    
    I=0
    J=1
    while read
    do
        [[ -f $DIR/$REPLY ]] && {
            ((I++))
            echo "Déplacement de $DIR/$REPLY..."
            [[ $I -le $NBRFILE ]] || {
                ((J++))
                NBRFILE=$(( $NBRFILE+$NBRFILE2 ))
                [[ $(( $NBRFILE+1 )) -eq $NBRFILETOT ]] && NBRFILE=$(( $NBRFILE+1 ))
            }
            mv "$DIR/$REPLY" "$DIR/$(basename "$DIR")$J/$REPLY"
        }
    done < <(ls -1 "$DIR")
done

echo "Tri terminé!"
exit

Dernière modification par Levi59 (Le 07/04/2011, à 16:50)

Hors ligne

#5 Le 03/04/2011, à 19:24

baba00000000

Re : Partager un dossier en 2 ou 3 ou 4 (bash)

Merci je planche encore dessus ( je regarderai plus tard)
J'essaye de comprendre comment alterné une variable ( un coup dans ce dossier un coup dans l'autre).
C'est pas si simple quand tu n'a pas les connaissance big_smile


http://racketiciel.info

http://racketiciel.info/petition/ Pétition qui ferra peut être changé les installations sur les pc vendu en France.

Hors ligne

#6 Le 03/04/2011, à 19:46

aduxas

Re : Partager un dossier en 2 ou 3 ou 4 (bash)

baba00000000 a écrit :

J'essaye de comprendre comment alterné une variable

Tu la soustrais de la somme des valeurs alternantes:  si ça doit basculer entre 1 et 2, i=3-i.  Il faut initialiser à 1, p.e.

Hors ligne

#7 Le 03/04/2011, à 19:56

pode

Re : Partager un dossier en 2 ou 3 ou 4 (bash)

baba00000000 a écrit :

J'essaye de comprendre comment alterner une variable ( un coup dans ce dossier un coup dans l'autre)

ça s'applique à la solution que j'avais proposé ; cf. script ci-dessous

$ cat repartition.sh 
#!/bin/bash
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
usage() {
echo "usage : $(basename $0) repertoire_source repertoire_cible1 repertoire_cible2"
}

if [ $# -ne 3 ]
then
  usage
  exit 1
fi

# initialisations
repertoire_source=$1
shift
repertoire_cible1=$1
shift
repertoire_cible2=$1

if [[ ! -d "${repertoire_source}" || ! -d "${repertoire_cible1}" || ! -d "${repertoire_cible2}" ]]
then
  usage
  exit 1
fi

echo "Contenu initial du repertoire ${repertoire_source}"
ls -F "${repertoire_source}"

# deplacement
tictac=0
for f in ${repertoire_source}/*
do
  if [ ! -f "${f}" ]
  then
    continue
  fi
  if [ ${tictac} = 0 ]
  then
    repertoire="${repertoire_cible1}"
    tictac=1
  else
    repertoire="${repertoire_cible2}"
    tictac=0
  fi
  mv "${f}" "${repertoire}"
done

echo "Contenu final du repertoire ${repertoire_cible1}"
ls -F "${repertoire_cible1}"

echo "Contenu final du repertoire ${repertoire_cible2}"
ls -F "${repertoire_cible2}"

Hors ligne

#8 Le 03/04/2011, à 22:25

Levi59

Re : Partager un dossier en 2 ou 3 ou 4 (bash)

J'ai mis à jour mon exemple...
Il accepte autant de dossier source que tu le souhaites (usage: lescript.sh  répertoire_source1 répertoire_source2 ... répertoire_sourceN), il demande le nombre de parties (choix global pour tous les répertoires_source), Il vérifie qu'il s'agit bien de dossiers, qu'il y a assez de fichiers pour faire toutes le parties (si tu as 5 fichiers et que tu veux faire 6 partie, ça bloquera), il créé ensuite les nouveau répertoires comme sous-dossier du répertoire_source en conservant son nom plus un numéro à partir de 1. Et il déplace tout le beau monde dans les différents dossiers.

Si tu ne comprend pas un point, demande moi. (Dsl j'ai pas pris le temps de commenter mon code)

Hors ligne

#9 Le 07/04/2011, à 11:04

baba00000000

Re : Partager un dossier en 2 ou 3 ou 4 (bash)

Bon voilà j'ai commencé à analysé un peu les codes que vous avez mis à ma disposition.
C'est du beau travail, je vous en remercie.
Car j'aurai jamais trouvé vos scripts trop débutant.

1ère question:

usage() {
echo "usage : $(basename $0) repertoire_source repertoire_cible1 repertoire_cible2"
}

J'ai vu que vous avez fait un usage() chacun. Pardon pour mon ignorance mais ça sert à quoi ?
surtout que dans l'exemple de pode y a un exit 1 et le script s'arrête.

Edit: j'ai compris maintenant que j'ai lance le script sans -x ( c'est un exemple quand on lance le script)
mais pourquoi il s'arrête à exit 1

Dernière modification par baba00000000 (Le 07/04/2011, à 11:05)


http://racketiciel.info

http://racketiciel.info/petition/ Pétition qui ferra peut être changé les installations sur les pc vendu en France.

Hors ligne

#10 Le 07/04/2011, à 16:49

Levi59

Re : Partager un dossier en 2 ou 3 ou 4 (bash)

J'ai oublié le exit dans usage en effet... C'est juste parce que le usage sert à donner les conditions d'utilisation du script et que l'on va les redonner dans le cas où il y a une erreur et donc il n'est pas necessaire de continuer l'execution du script dans ce cas. On préfère demander une correction avant toute modification...

Le nombre qui suit le exit n'est pas vraiment important... En fait c'est le code d'erreur à renvoyer (par exemple si tout s'est bien passé, en fin de script, on met "exit 0")

Dernière modification par Levi59 (Le 07/04/2011, à 16:51)

Hors ligne