#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 )
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/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/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
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)
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)
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/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