Re: [Confirme] [Script BASH] vérifier taille fichier avant de le déplacer avec mv
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
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
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