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

jipe <[email protected]>
Newsgroups gmane.linux.mandrake.expert.french
Message-ID <20070129175447.2449c595@localhost>
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:

[jipe@esther 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

[jipe@esther 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))

[jipe@esther 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.

[jipe@esther incoming]$ set -- $(df -k /home/jipe/video); eval dispo=\${$(($#-2))}; echo $dispo
828476
[jipe@esther incoming]$ ls -l *.avi | while read a b c d taille e f g avi; do taille=$((taille/1024)); dispo=$((dispo-taille)); if ((dispo>0)); 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
message-footer.txt (text/plain, 232 B)
____________________________________________________
Want to buy your Pack or Services from Mandriva? 
Go to http://store.mandriva.com
Join the Club : http://www.mandrivaclub.com
____________________________________________________
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.