Scanner fichiers et supprimer si supérieurs à xxx Mo

Scanner fichiers et supprimer si supérieurs à xxx Mo - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 14-02-2006 à 16:03:57    

Bonjour,
 
Je connais simplement les commandes de base sous linux
j'aimerai faire une tache cron qui scanne tous les fichiers de /home et supprime ceux supérieurs à un certain poids
 
je n'ai aucune idée de quoi faire, par ou commencer etc :s
 
 
 
j'aimerais également faire une tâche un peu plus compliquée qui scanne le code source de fichiers web ayant un certain nom, et si ils ne comportent pas une certaine partie, ils sont également supprimés
 
 
merci beaucoup !

Reply

Marsh Posté le 14-02-2006 à 16:03:57   

Reply

Marsh Posté le 14-02-2006 à 16:37:06    

Pour ton premier problème :  
find couplé avec une boucle for puis rm
Pour le second :
si c'est une ligne particulière type : "<? echo toto ?>"
alors utilise grep <chaine spécifique> , si grep ne retourne rien -> suppression du fichier.
 

Reply

Marsh Posté le 14-02-2006 à 16:47:12    

je n'ai trouvé que -atime et -name comme attribut find :s
pour grep ca a l'air plus facile il n'a que ca comme fonction
 
aussi comment faire pour supprimer le fichier si il a cette fonction ?
j'ai trouvé la commande, rm, mais comment faire dans ce cas ?
il y a un système de If "" > "" ?
 
 
et finalement, comment mettre en place ces commandes ? dans un ficheir bash c'est ca ? (j'en ai entendu parlé rbièvement)


Message édité par Proxounet le 14-02-2006 à 16:47:58
Reply

Marsh Posté le 14-02-2006 à 16:54:13    

Citation :

je n'ai trouvé que -atime et -name comme attribut find :s


tu as mal cherché -> "man find" puis regarde l'option -size  

Citation :

dans un ficheir bash c'est ca ?


Oui

Reply

Marsh Posté le 14-02-2006 à 16:56:15    

find /home -type f -size -2k -exec rm "{}" \;
(supprime les fichiers de taille inférieure à 2 ko, +2k pour taille supérieure à 2ko et 2k pour taille strictement égale à 2ko)
 
pour le second : grep -e "ton expression" -L -r -s /home | xargs rm
(ça ne marche que si ton expression est contenue dans une ligne)

Reply

Marsh Posté le 14-02-2006 à 17:05:22    

Apres ptite recherche sur bash apparemment i lfaut simplement le faire commencer par #!/bin/bash ?
 
donc, pour Taille supérieure a 1Mo :
 
#!/bin/bash
find /home -type f -size +1M -exec rm "{}" \;
grep -e "ton expression" -L -r -s /home | xargs rm
 
Mais peut on spécifier le nom des fichiers à scanner par grep ? en l occurence ce ne sont que des fichiers type 1nom.htm 1nom.html etc etc
 
 
 
Est ce que je peux etre un petit peu féniant et vous demander qques explications ? :sweat:  
 
par exemple que veux dire "-type f"  
et a quoi sert \; ? \pour arreter la suppression et ; pour passer a la ligne suivante ?
et -L -r ? et finalement pourquoi un "exec" et un "xargs" ? il y a un truc diff comme cela pour chaque commande ?  :pt1cable:


Message édité par Proxounet le 14-02-2006 à 17:07:54
Reply

Marsh Posté le 14-02-2006 à 17:11:47    

Citation :

par exemple que veux dire "-type f"


"man find"

-type c
              Fichier du type c  
              f      fichier régulier


même chose pour -exec (partie action)
 
pour xargs -> man xargs

Reply

Marsh Posté le 14-02-2006 à 17:13:50    

Dak merci je n'ai pas encore le réflexe de MAN dont tout le monde aprle pourtant
 
par contre ce qui membete c'est pour scanner les ficheirs portant un certain nom :(

Reply

Marsh Posté le 14-02-2006 à 17:16:38    

Citation :

par contre ce qui membete c'est pour scanner les ficheirs portant un certain nom :(


Pourquoi, la ligne de commande ne te convient pas ? tu aurais un exemple ?

Reply

Marsh Posté le 14-02-2006 à 17:20:56    

Oui par exemple si il scanne un fichier truc.php ne comportant pas l'expression voulue, il va le supprimer,  
alors que je voudrais qu'il ne fasse ca que pour les fichiers portant certains nom : 1certainnom.htm, 1certainnom.html, 1certainnom.php ...


Message édité par Proxounet le 14-02-2006 à 17:21:18
Reply

Marsh Posté le 14-02-2006 à 17:20:56   

Reply

Marsh Posté le 14-02-2006 à 17:23:25    

je crois avoir trouvé file --file=FICHIER dans le man
 
 
       -f FICHIER, --file=FICHIER
              Lire les motifs dans le FICHIER indiqué, un motif par ligne.  Un
              fichier  vide ne contient aucun motif, si bien qu'aucune concor-
              dance n'est trouvée.
 
Pouvez vous confirmer ? comment séparer les diff noms de ficheirs a scanner ?

Reply

Marsh Posté le 14-02-2006 à 17:32:16    

ensuite tu peux utiliser l'option -name de find ;)

Reply

Marsh Posté le 14-02-2006 à 18:52:47    

Ca fera un truc du genre
 
#!/bin/bash
find /home -type f -size +1M -exec rm "{}" \;
find /home -type f -name 1nom.htm 1nom.html -exec grep -e "ton expression" -L -r -s /home | xargs rm
 
?


Message édité par Proxounet le 14-02-2006 à 18:53:17
Reply

Marsh Posté le 14-02-2006 à 19:01:43    

Citation :

-name 1nom.htm 1nom.html


attention c'est un motif à mettre :
ex: -name "*.php"

Reply

Marsh Posté le 14-02-2006 à 19:34:08    

Donc :
 
#!/bin/bash
find /home -type f -size +1M -exec rm "{}" \;
find /home -type f -name "1nom.htm 1nom.html" -exec grep -e "ton expression" -L -r -s /home | xargs rm  
 
?
Et l'éxec se fait sous cette syntaxe ?

Reply

Marsh Posté le 14-02-2006 à 20:52:17    

le 2ème non :
-exec grep -e "ton expression"
peut être que ça devrait mieux marcher :
-exec grep -e "ton expression" -L -r -s "{}" | xargs rm\;
 
sinon le motif "1nom.htm 1nom.html" est incorrect
regarde les exemples de motif donnés dans "man find"

Reply

Marsh Posté le 14-02-2006 à 21:24:19    

Comprends rien aux motifs :s
 
       -name motif
              Fichier  dont  le  nom  de  base (sans les répertoires du chemin
              d'accès), correspond au motif  du  shell.   Les  méta-caractères
              (`*', `?', et `[]') ne sont jamais mis en correspondance avec un
              point `.'  au début du nom.  Pour ignorer un  répertoire,  ainsi
              que  tous  ses sous-répertoires, utiliser l'option -prune ; vous
              trouverez un exemple dans la description de l'option -path.

Reply

Marsh Posté le 14-02-2006 à 21:32:58    

dans le man :

Par exemple, pour mettre en correspondance
              un fichier nommé `./fubar3', vous pouvez  utiliser  les  expres-
              sions rationnelles `.*bar.' ou `.*b.*3', mais pas `b.*r3'.


Dans ton cas, tu veux les fichiers 1nom.html et 1nom.htm
le motif sera : "1nom.htm*"

Reply

Marsh Posté le 14-02-2006 à 21:44:46    

haaa d'accord ou même 1nom.*
merci beaucoup ;)

Reply

Marsh Posté le 14-02-2006 à 21:59:14    

Citation :

find: Type invalide pour l'option -size `M'
find: Paramètre manquant pour `-exec'
xargs: rm;: Aucun fichier ou répertoire de ce type


 
> donc j'ai remplacé par 1000K, ca marchait pas, donc par 1000000, plus de message d'erreur mais ca ne marchait toujours pas
 
j'ai donc remplacé /home par /home/*,
> marche toujours pas


Message édité par Proxounet le 14-02-2006 à 21:59:22
Reply

Marsh Posté le 14-02-2006 à 22:01:07    

par contre, il faudra adapter grep de exec, car la commande 'grep -e "ton expression" -L -r -s /home' va examiner tous les fichier du répertoire /home
Donc si le fichier ne contient pas "maligne" -> on le supprime

test -z "`grep -e "maligne" "{}"`" && rm "{}"


à tester, peut être y aura t-il des problèmes de quote. Dans tous les cas n'execute pas de rm "{}" mais in echo "{}" pour être sûr que le script fonctionne.
 

Reply

Marsh Posté le 14-02-2006 à 22:07:03    

cela donne

Citation :

grep: {}: Aucun fichier ou répertoire de ce type
{}


 
En fait je ne suis pas trop sûr de ce que je devais faire avce ca  :sweat:  
je l'ai simplement mis dans un .sh exécutable, c'est bien cela a quoi le bout de code servait ?


Message édité par Proxounet le 14-02-2006 à 22:08:34
Reply

Marsh Posté le 14-02-2006 à 22:10:40    

essaye comme ceci (à ajouter dans le find):

-exec test -z "`grep -e "ton expression" "{}"`" && rm "{}"


ou

-exec [ -z "`grep -e "ton expression" "{}"`" ] && rm "{}"


Message édité par jlighty le 14-02-2006 à 22:12:04
Reply

Marsh Posté le 14-02-2006 à 22:18:16    

Alors je met précisément cela donne pour chaque script sinon on va s'embrouiller :
 

Citation :

#!/bin/bash
find /home -type f -size +1000000 -exec rm "{}" \;
find /home -type f -name index.* -exec test -z "`grep -e "ton expression" "{}"`" && echo "{}"


 
donne
 

Citation :

grep: {}: Aucun fichier ou répertoire de ce type
find: Paramètre manquant pour `-exec'


 
 
------------------
 

Citation :

#!/bin/bash
find /home -type f -size +1000000 -exec rm "{}" \;
find /home -type f -name index.* -exec [ -z "`grep -e "ton expression" "{}"`" ] && rm "{}"


 
donne
 

Citation :

grep: {}: Aucun fichier ou répertoire de ce type
find: Paramètre manquant pour `-exec'


 
-------
 
sans oublier que j'ai viré le emsasge d'erreur pour la taille mais cela ne supprime rien :(
pour faire mes test :
j'ai créé un fichier /home/henri/index.php avec comme contenu test
un fichier /home/henri/jesaisplusquoi.mp3 supérieur a 1Mo
un fichier /home/henri/test/jesaisplusquoi.mp3 supérieur a 1Mo pour voir si cela amrche avec les sous répertoires


Message édité par Proxounet le 14-02-2006 à 22:20:07
Reply

Marsh Posté le 15-02-2006 à 13:41:25    

"touvé"

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed