Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

script bash

13 réponses
Avatar
ppellero
Bonjour,

J'ai un site h=E9berg=E9 sur un serveur Linux et veux effacer dans un=20
r=E9pertoire tous les fichiers .jpg issus d'une webcam qui s'accumulent.
J'ai la possibilit=E9 de lancer une tache planifi=E9e.
Je pensais =E0 un fichier bash :
#!/bin/bash
rm -f *.jpg
Je suis novice sur Linux, est-ce que cela peut marcher?

Merci de votre attention.

10 réponses

1 2
Avatar
olafkewl
Le 09/08/2010 17:54, ppellero a écrit :
Bonjour,

J'ai un site hébergé sur un serveur Linux et veux effacer dans un
répertoire tous les fichiers .jpg issus d'une webcam qui s'accumulent.
J'ai la possibilité de lancer une tache planifiée.
Je pensais à un fichier bash :
#!/bin/bash
rm -f *.jpg
Je suis novice sur Linux, est-ce que cela peut marcher?

Merci de votre attention.



Dans une petite boucle :
for i in `find . -name "*.jpg"`
do
rm -f $i
done

Il faudra bien sur se placer dans le bon répertoire avant.
Si tu veux garder certaines images, tu peux aller voir du coté de find
et de ses option ctime / mtime
Il y a pas mal de littérature à ce propos sur le web.
Avatar
Yliur
Le Mon, 09 Aug 2010 17:54:48 +0200
ppellero a écrit :

Bonjour,

J'ai un site hébergé sur un serveur Linux et veux effacer dans un
répertoire tous les fichiers .jpg issus d'une webcam qui s'accumulent.
J'ai la possibilité de lancer une tache planifiée.
Je pensais à un fichier bash :
#!/bin/bash
rm -f *.jpg
Je suis novice sur Linux, est-ce que cela peut marcher?

Merci de votre attention.




Attention au répertoire qui sera le répertoire courant au moment
d'exécuter ce script.
Avatar
Yliur
Le Mon, 09 Aug 2010 19:45:27 +0200
olafkewl a écrit :

Le 09/08/2010 17:54, ppellero a écrit :
> Bonjour,
>
> J'ai un site hébergé sur un serveur Linux et veux effacer dans un
> répertoire tous les fichiers .jpg issus d'une webcam qui
> s'accumulent. J'ai la possibilité de lancer une tache planifiée.
> Je pensais à un fichier bash :
> #!/bin/bash
> rm -f *.jpg
> Je suis novice sur Linux, est-ce que cela peut marcher?
>
> Merci de votre attention.

Dans une petite boucle :
for i in `find . -name "*.jpg"`
do
rm -f $i
done



Quel est l'avantage de cette solution ?


Il faudra bien sur se placer dans le bon répertoire avant.
Si tu veux garder certaines images, tu peux aller voir du coté de
find et de ses option ctime / mtime
Il y a pas mal de littérature à ce propos sur le web.

Avatar
Ericus
Salut

c'est quoi l'avantage d'une boucle par rapport au rm *.jpg ?

à+
eric


Le 09/08/10 19:45, olafkewl a écrit :
Le 09/08/2010 17:54, ppellero a écrit :
Bonjour,

J'ai un site hébergé sur un serveur Linux et veux effacer dans un
répertoire tous les fichiers .jpg issus d'une webcam qui s'accumulent.
J'ai la possibilité de lancer une tache planifiée.
Je pensais à un fichier bash :
#!/bin/bash
rm -f *.jpg
Je suis novice sur Linux, est-ce que cela peut marcher?

Merci de votre attention.



Dans une petite boucle :
for i in `find . -name "*.jpg"`
do
rm -f $i
done

Il faudra bien sur se placer dans le bon répertoire avant.
Si tu veux garder certaines images, tu peux aller voir du coté de find
et de ses option ctime / mtime
Il y a pas mal de littérature à ce propos sur le web.

Avatar
Damien Goutte-Gattat
On Mon, 09 Aug 2010 21:04:16 +0200, Ericus wrote:
c'est quoi l'avantage d'une boucle par rapport au rm *.jpg ?



Le simple "rm *.jpg" présente un risque : s’il y a vraiment *beaucoup* de
fichiers, l’expansion du wildcard peut dépasser la taille maximale
autorisée pour une ligne de commande, produisant une erreur « Argument
list too long ».

La boucle proposée souffre du même problème et donc n’offre pas
d’avantage particulier par rapport au "rm *.jpg" (du moins à ma
connaissance), en revanche une boucle dans ce genre :

find . -name "*.jpg" | while read x
do
rm -f $x
done

contourne le problème.

Néanmoins dans ce cas précis, le but étant de supprimer les fichiers, le
plus simple me semble être l’option -delete de find, permettant de faire
directement :

find . -name "*.jpg" -delete
Avatar
Nicolas George
Damien Goutte-Gattat wrote in message
:
Le simple "rm *.jpg" présente un risque : s’il y a vraiment *beaucoup* de
fichiers, l’expansion du wildcard peut dépasser la taille maximale
autorisée pour une ligne de commande, produisant une erreur « Argument
list too long ».



Cette limite n'existe plus depuis Linux 2.6.23.

La boucle proposée souffre du même problème



Non, la liste n'est pas passée à travers l'exécution d'une commande externe.

et donc n’offre pas
d’avantage particulier par rapport au "rm *.jpg" (du moins à ma
connaissance), en revanche une boucle dans ce genre :
find . -name "*.jpg" | while read x
do
rm -f $x
done
contourne le problème.



Mais les deux se vautrent lamentablement quand il y a des espaces dans les
noms de fichiers. Ou n'importe quel caractère spécial, ici, puisque $x n'est
pas échappé.
Avatar
Erwan David
Damien Goutte-Gattat écrivait :

On Mon, 09 Aug 2010 21:04:16 +0200, Ericus wrote:
c'est quoi l'avantage d'une boucle par rapport au rm *.jpg ?



Le simple "rm *.jpg" présente un risque : s’il y a vrai ment *beaucoup* de
fichiers, l’expansion du wildcard peut dépasser la taille ma ximale
autorisée pour une ligne de commande, produisant une erreur «  Argument
list too long ».

La boucle proposée souffre du même problème et donc n⠀™offre pas
d’avantage particulier par rapport au "rm *.jpg" (du moins à ma
connaissance), en revanche une boucle dans ce genre :

find . -name "*.jpg" | While read x
do
rm -f $x
done

contourne le problème.



Il y a nettemnt plus efficace avec
find . -name "*.jpg" |xargs rm -f

Mais il ne faut pas faire ça comme ça : là on va faire des r m des
répertoires appelés toto.jpg

Donc
find . -type f -name "*.jpg" |xargs rm -f

Mais il faut aussi tenir compte des espaces dans les noms de fichier,
donc
find . -type f -name "*.jpg" -print0 | xargs -0 rm -f

Mais si on a le gnu find (en général c'est le cas sous linux) on peut se
passer du xargs et faire

find . -type f -name "*.jpg" -exec rm -f {} +


Néanmoins dans ce cas précis, le but étant de supprimer le s fichiers, le
plus simple me semble être l’option -delete de find, permett ant de faire
directement :

find . -name "*.jpg" -delete



find . -type f -name "*.jpg" -delete
En vérifiant cependant que -delete est bien équivalent au rm -f p lutôt
qu'au rm.

--
Le travail n'est pas une bonne chose. Si ça l'était,
les riches l'auraient accaparé
Avatar
Damien Goutte-Gattat
On Mon, 09 Aug 2010 23:27:53 +0200, ppellero wrote:
#!/bin/bash
#rm *.jpg
find . -name "*.jpg" -delete

j'ai mis les droits à 777 au fichier "efface_jpg" et il est dans le
répertoire où se trouvent les .jpg. Il est lancé par une tache qui
s'exécute toutes les heures.



As-tu vérifié que le script s’exécutait dans le bon répertoire ? Au
besoin rends-toi dans le répertoire cible voulu avant le find. Ou bien
précise à find le chemin absolu vers ce répertoire, au lieu du .
signifiant le répertoire courant :

find /répertoire -name "*.jpg" -delete

Placer le script dans le répertoire où tu veux effacer les fichiers n’est
pas utile. Le répertoire courant ne dépend pas de l’emplacement du script.
Avatar
Nicolas George
Erwan David wrote in message
:
Mais si on a le gnu find (en général c'est le cas sous linux) on peut se
passer du xargs et faire
find . -type f -name "*.jpg" -exec rm -f {} +



Cette construction est dans la norme Unix, ce n'est pas spécifique à GNU
find. D'ailleurs, GNU find a plutôt été à la traîne pour l'avoir.
Avatar
Erwan David
Nicolas George <nicolas$ écrivait :

Erwan David wrote in message
:
Mais si on a le gnu find (en général c'est le cas sous linux) on peut se
passer du xargs et faire
find . -type f -name "*.jpg" -exec rm -f {} +



Cette construction est dans la norme Unix, ce n'est pas spécifique à GNU
find. D'ailleurs, GNU find a plutôt été à la traîne pour l'avoir.



Le + est GNU, avec un ; à la place c'est standard. Mais ça forque un rl
parfichier, alors que le +, comme le xargs va regrouper les fichiers
pour moins forker.

--
Le travail n'est pas une bonne chose. Si ça l'était,
les riches l'auraient accaparé
1 2