Re: [Confirme] [Script BASH] vérifier taille fichier avant de le déplacer avec mv

2007-01-30 Par sujet zelos 414

J'ai pas très bie n compris cette ligne:

set -- $(df -k /home/jipe/video); eval dispo=\${$(($#-2))}; echo $dispo
828476

PS: en tous cas, bravo à jipe et napo978 pour leurs démonstrations de bash!!!

Le 29/01/07, jipe[EMAIL PROTECTED] a écrit :

On Sun, 28 Jan 2007 15:35:32 +0100
linux_forever [EMAIL PROTECTED] wrote:

 Bonjour,

 J'ai réalisé un rapide script (heu... une ligne de commande) qui me permet de
 déplacer des fichiers d'un répertoire vers un autres:

 mv /home/user/*.avi /mnt/disque/avi/

 Cela me déplace donc tous mes fichiers.
 Le problème que j'ai c'est que si le rep de destination est presque plein, il
 me transfère tout de même une partie de mes fichiers, et je me retrouve sur
 le rep de destination avec des fichiers non valides car non complet Par
 fois même de 0 octets, que seul le root peut supprimer

 Le but serait donc de vérifier la place dispo, avant le déplacement de chaque
 fichier:

 Pour récupérer la place du disque courrant en ko, j'e fait ceci
 du -shk | cut -f1 #place sur le rep courrant en kilo octets

 Mon problème serait donc de pouvoir boucler sur chaque fichier afin de
 vérifier la taille

 Merci de votre aide et bon dimanche!


évite les pipes trop longs ainsi que les répétitions de commande. tu peux 
boucler avec for
sur tous les avi d'un répertoire et faire une commande qui te donne la taille 
de chacun
comme du ou ls -l par exemple, soit autant de fois la commande, ou lancer une 
commande une fois
pour tous les avi et en récupérer le résultat dans une boucle while qui prend 
chaque ligne
de la commande comme argument. exemple:

ls -l *.avi # va te donner ça:

[EMAIL PROTECTED] incoming]$ ls -l *.avi
-rw-r--r--  1 jipe jipe  176144384 jan 23 10:21 mon avi n01.avi
-rw-r--r--  1 jipe jipe  176105472 jan 23 04:37 mon avi n02.avi
-rw-r--r--  1 jipe jipe  176310272 jan 23 06:01 mon avi n03.avi
-rw-r--r--  1 jipe jipe 1565468672 jan 15 11:28 mon avi n04.avi

les champs intéressants sont 5 et 8. on peut les récupérer dans une boucle 
while ainsi:

while read a b c d taille e f g avi; do echo $taille $avi; done

chaque lettre après read représente un champ, les champs intéressants sont 
nommés taille et avi

[EMAIL PROTECTED] incoming]$ ls -l *.avi | while read a b c d taille e f g avi; do echo 
$taille $avi; done
176144384 mon avi n01.avi
176105472 mon avi n02.avi
176310272 mon avi n03.avi
1565468672 mon avi n04.avi

pour avoir la taille en ko, il suffit de remplacer $taille par $((taille/1024))

[EMAIL PROTECTED] incoming]$ ls -l *.avi | while read a b c d taille e f g avi; 
do echo $((taille/1024)); done
172016
171978
172178
1528778

pour récupérer l'espace disponible tu peux utiliser df. là aussi tu peux le 
faire pour chaque fichier ou
seulement une fois au début et soustraire.

[EMAIL PROTECTED] incoming]$ set -- $(df -k /home/jipe/video); eval 
dispo=\${$(($#-2))}; echo $dispo
828476
[EMAIL PROTECTED] incoming]$ ls -l *.avi | while read a b c d taille e f g avi; do 
taille=$((taille/1024)); dispo=$((dispo-taille)); if ((dispo0)); then echo déplacement de 
$avi possible; else echo déplacement de $avi impossible; fi; done
déplacement de mon avi n01.avi possible
déplacement de mon avi n02.avi possible
déplacement de mon avi n03.avi possible
déplacement de mon avi n04.avi impossible

voilà, il ne te reste plus qu'à adapter à ton besoin et à te lancer avec mv :þ.
n'oublie pas de quoter tes variables avec  si tu as des fichiers avec espaces


bye
jipe







Want to buy your Pack or Services from Mandriva?
Go to http://store.mandriva.com
Join the Club : http://www.mandrivaclub.com





Want to buy your Pack or Services from Mandriva? 
Go to http://store.mandriva.com
Join the Club : http://www.mandrivaclub.com



Re: [Confirme] [Script BASH] vérifier taille fichier avant de le déplacer avec mv

2007-01-29 Par sujet napo978
un petit truc comme ca devrait fonctionner... (ps teste)

PARTITION=/dev/hda2 #partition ou tu vx mettre tes films
REP_FILM=/home/films #nv repertoire des films

for i in *.*{avi|AVI|mkv|MKV}; do
film_size=`du $i`
free_size=`df --sync -P $PARTITION | awk 
/Available/'{next}//{split($0,a, ); print a[4] }' -`
[ $free_size -gt $film_size ]  mv $i $REP_FILM
done

la ligne avec awk peut etre remplacee par un truc de ce style : df -P
--sync /dev/hda2 | tail -n 1 |tr -s ' ' |c ' |cut -d ' ' -f 4

j espere que ca te vas...
B-

 Bonjour,

 Il y a une solution de paresseux ...
 1) Tu crées un répertoire /home/user/tmp_avi
 2) Tu déplaces tes .avi dans ce répertoire (pas de risque, tu restes sur
 la
 même partition)
 3) Tu lances ton du sur ce répertoire

 Bon, c'est un peu goret, mais ça dépanne.

 Maintenant, pour faire une boucle,  ça va ressembler à :
 size=0
 for file in $(ls *.avi); do
 size+=$(df -shk | cut -f1)
 done

 Bon, là c'est sans filet, parce que je suis sous Win, et je ne connais pas
 le bash par coeur.
 Donc, je te suggère un man bash pour aller plus loin.

 Bonne continuation,
 J-L
 Le 28/01/07, linux_forever [EMAIL PROTECTED] a écrit :

 Bonjour,

 J'ai réalisé un rapide script (heu... une ligne de commande) qui me
 permet
 de
 déplacer des fichiers d'un répertoire vers un autres:

 mv /home/user/*.avi /mnt/disque/avi/

 Cela me déplace donc tous mes fichiers.
 Le problème que j'ai c'est que si le rep de destination est presque
 plein,
 il
 me transfère tout de même une partie de mes fichiers, et je me retrouve
 sur
 le rep de destination avec des fichiers non valides car non complet
 Par
 fois même de 0 octets, que seul le root peut supprimer

 Le but serait donc de vérifier la place dispo, avant le déplacement de
 chaque
 fichier:

 Pour récupérer la place du disque courrant en ko, j'e fait ceci
 du -shk | cut -f1 #place sur le rep courrant en kilo octets

 Mon problème serait donc de pouvoir boucler sur chaque fichier afin de
 vérifier la taille

 Merci de votre aide et bon dimanche!


 
 Want to buy your Pack or Services from Mandriva?
 Go to http://store.mandriva.com
 Join the Club : http://www.mandrivaclub.com
 







Want to buy your Pack or Services from Mandriva? 
Go to http://store.mandriva.com
Join the Club : http://www.mandrivaclub.com



Re: [Confirme] [Script BASH] vérifier taille fichier avant de le déplacer avec mv

2007-01-29 Par sujet jipe
On Sun, 28 Jan 2007 15:35:32 +0100
linux_forever [EMAIL PROTECTED] wrote:

 Bonjour,
 
 J'ai réalisé un rapide script (heu... une ligne de commande) qui me permet de 
 déplacer des fichiers d'un répertoire vers un autres:
 
 mv /home/user/*.avi /mnt/disque/avi/
 
 Cela me déplace donc tous mes fichiers.
 Le problème  que j'ai c'est que si le rep de destination est presque plein, 
 il 
 me transfère tout de même une partie de mes fichiers, et je me retrouve sur 
 le rep de destination avec des fichiers non valides car non complet Par 
 fois même de 0 octets, que seul le root peut supprimer
 
 Le but serait donc de vérifier la place dispo, avant le déplacement de chaque 
 fichier:
 
 Pour récupérer la place du disque courrant en ko, j'e fait ceci
 du -shk  | cut -f1 #place sur le rep courrant en kilo octets
 
 Mon problème serait donc de pouvoir boucler sur chaque fichier afin de 
 vérifier la taille
 
 Merci de votre aide et bon dimanche!
 

évite les pipes trop longs ainsi que les répétitions de commande. tu peux 
boucler avec for
sur tous les avi d'un répertoire et faire une commande qui te donne la taille 
de chacun
comme du ou ls -l par exemple, soit autant de fois la commande, ou lancer une 
commande une fois
pour tous les avi et en récupérer le résultat dans une boucle while qui prend 
chaque ligne 
de la commande comme argument. exemple:

ls -l *.avi # va te donner ça:

[EMAIL PROTECTED] incoming]$ ls -l *.avi
-rw-r--r--  1 jipe jipe  176144384 jan 23 10:21 mon avi n01.avi
-rw-r--r--  1 jipe jipe  176105472 jan 23 04:37 mon avi n02.avi
-rw-r--r--  1 jipe jipe  176310272 jan 23 06:01 mon avi n03.avi
-rw-r--r--  1 jipe jipe 1565468672 jan 15 11:28 mon avi n04.avi

les champs intéressants sont 5 et 8. on peut les récupérer dans une boucle 
while ainsi:

while read a b c d taille e f g avi; do echo $taille $avi; done

chaque lettre après read représente un champ, les champs intéressants sont 
nommés taille et avi

[EMAIL PROTECTED] incoming]$ ls -l *.avi | while read a b c d taille e f g avi; 
do echo $taille $avi; done
176144384 mon avi n01.avi
176105472 mon avi n02.avi
176310272 mon avi n03.avi
1565468672 mon avi n04.avi

pour avoir la taille en ko, il suffit de remplacer $taille par $((taille/1024))

[EMAIL PROTECTED] incoming]$ ls -l *.avi | while read a b c d taille e f g avi; 
do echo $((taille/1024)); done
172016
171978
172178
1528778

pour récupérer l'espace disponible tu peux utiliser df. là aussi tu peux le 
faire pour chaque fichier ou
seulement une fois au début et soustraire.

[EMAIL PROTECTED] incoming]$ set -- $(df -k /home/jipe/video); eval 
dispo=\${$(($#-2))}; echo $dispo
828476
[EMAIL PROTECTED] incoming]$ ls -l *.avi | while read a b c d taille e f g avi; 
do taille=$((taille/1024)); dispo=$((dispo-taille)); if ((dispo0)); then echo 
déplacement de $avi possible; else echo déplacement de $avi impossible; fi; 
done
déplacement de mon avi n01.avi possible
déplacement de mon avi n02.avi possible
déplacement de mon avi n03.avi possible
déplacement de mon avi n04.avi impossible

voilà, il ne te reste plus qu'à adapter à ton besoin et à te lancer avec mv :þ.
n'oublie pas de quoter tes variables avec  si tu as des fichiers avec espaces


bye
jipe





Want to buy your Pack or Services from Mandriva? 
Go to http://store.mandriva.com
Join the Club : http://www.mandrivaclub.com