[LINUX] Search and destroy

Search and destroy [LINUX] - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 24-03-2005 à 09:29:21    

Bonjour,
 
C'est la guerre ici, je suis en lutte contre mes utilisateurs qui saturent les disques de mon serveur à coup de MP3, de WMA (beurk) et vidéos etc.
 
Evidemment je ne peux pas laisser faire ça. Mon but est donc de rechercher le fichiers et de les supprimer...
 
Comme ceci:

find /home -iname *.mp3 > mp3.log
rm `cat mp3.log`


 
Ca ne fonctionne pas à cause des espaces dans certains nom de fichiers.
J'ai pensé à un script:
 

# !/bin/sh
for son in `find /home -iname *.mp3`
  do
    rm $son
  done


 
Même souci, je n'arrive pas à "échapper" ces foutus espaces, quelqu'un a-t-il une idée?


Message édité par nicephore17 le 24-03-2005 à 14:59:08
Reply

Marsh Posté le 24-03-2005 à 09:29:21   

Reply

Marsh Posté le 24-03-2005 à 09:31:59    

change ton IFS (gruik)

Reply

Marsh Posté le 24-03-2005 à 09:38:01    

Je suis pas particulièrement chaud pour changer l'IFS d'un serveur qui tourne avec 890 utilisateurs et 300 bécanes au cul...

Reply

Marsh Posté le 24-03-2005 à 09:39:47    

tu le fais dans un script [:spamafote]

Reply

Marsh Posté le 24-03-2005 à 09:47:43    

find toto/ -iname *.mp3 -exec rm {} \;


 
 
Tu appliques rm au résultat de find, les espaces ne seront pas un pb je viens de tester.


Message édité par Xavier_OM le 24-03-2005 à 11:10:58

---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 24-03-2005 à 09:49:44    

nicephore17 a écrit :


Code :
  1. # !/bin/sh
  2. for son in `find /home -iname *.mp3`
  3.   do
  4.     rm $son
  5.   done


 
Même souci, je n'arrive pas à "échapper" ces foutus espaces, quelqu'un a-t-il une idée?


 

Code :
  1. # !/bin/sh
  2. for son in `find /home -iname *.mp3`
  3.   do
  4.     rm "$son"
  5.   done


 
:??:

Reply

Marsh Posté le 24-03-2005 à 09:50:18    

# !/bin/sh
ifs_save=$IFS
# Je sauve mon IFS par défaut pour le restaurer à la fin du script
IFS=$'\t\n'
for son in `find /home -iname *.mp3`
  do
    rm $son
  done
# Je restaure mon IFS par défaut
IFS=$ifs_save


 
Un truc dans ce goût là?
Je vais essayer.
 
Neriki -> pas bon, j'avais essayé, il interprète ça comme si il devait effacer le fichier "$son"


Message édité par nicephore17 le 24-03-2005 à 13:59:51
Reply

Marsh Posté le 24-03-2005 à 09:54:01    

IFS=$'\t\n'
 
:)

Reply

Marsh Posté le 24-03-2005 à 09:59:50    


 
\n c'est un saut de ligne mais \t c'est quoi  :??:

Reply

Marsh Posté le 24-03-2005 à 10:40:17    

2 solutions ( a mon avis ) :
- Faire le script dans un vrai langage de programation qui ne se pose pas ce genre de problèmes. Suggestions : Python, Perl
- find toto/ -iname *.mp3 -exec rm \"{}\" \;

Reply

Marsh Posté le 24-03-2005 à 10:40:17   

Reply

Marsh Posté le 24-03-2005 à 12:06:12    

nicephore17 a écrit :

\n c'est un saut de ligne mais \t c'est quoi  :??:


tabulation

Reply

Marsh Posté le 24-03-2005 à 12:21:54    

Ce script m'interesse  :D, ce serait possible de le coupler avec "file" au cas où l'extension du fichier serait modifiée.
 
Sur samba, on peut ajouter l'option
 
veto files = /*.mp3/*.MP3/*.mpg/*.MPG
 
veto files(S)
              This is a list of files and directories that are neither visible nor accessible. Each entry in the
              list must be separated by a '/', which allows spaces to be included in the entry. '*' and '?'  can
              be used to specify multiple files or directories as in DOS wildcards.

Reply

Marsh Posté le 24-03-2005 à 13:48:43    

hwlm a écrit :

Ce script m'interesse  :D, ce serait possible de le coupler avec "file" au cas où l'extension du fichier serait modifiée.
 
Sur samba, on peut ajouter l'option
 
veto files = /*.mp3/*.MP3/*.mpg/*.MPG
 
veto files(S)
              This is a list of files and directories that are neither visible nor accessible. Each entry in the
              list must be separated by a '/', which allows spaces to be included in the entry. '*' and '?'  can
              be used to specify multiple files or directories as in DOS wildcards.


 
Je suis contre le véto dans mon environnement...
1) ce n'est pas "pédagogique"
2) difficile de gérer les "exceptions"

Reply

Marsh Posté le 24-03-2005 à 13:55:41    

ma solution marche pas chez toi ?


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 24-03-2005 à 13:58:53    

Xavier_OM a écrit :

ma solution marche pas chez toi ?


 

se3pdc:~# find /root -iname *.mp3 -exec rm {} ;
find: missing argument to `-exec'


Message édité par nicephore17 le 24-03-2005 à 13:59:28
Reply

Marsh Posté le 24-03-2005 à 13:59:38    

j'ai écris \; et pas ;


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 24-03-2005 à 14:04:04    

Xavier_OM a écrit :

j'ai écris \; et pas ;


 
exact, ça marche.
Tu sais comment je peux logger dans la même manip?
 

find /root -iname *.mp3 > mp3.log -exec rm {} \;

???


Message édité par nicephore17 le 24-03-2005 à 14:06:52
Reply

Marsh Posté le 24-03-2005 à 14:08:22    

euh faudrait mettre dans le -exec et avant le rm un truc genre echo {} >> log je pense
 
edit : ptet un truc genre  
 
find /tmp -iname *.mp3 -exec echo {} >> log \; -exec rm {} \;
 


Message édité par Xavier_OM le 24-03-2005 à 14:16:46

---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 24-03-2005 à 14:57:20    

Xavier_OM a écrit :

euh faudrait mettre dans le -exec et avant le rm un truc genre echo {} >> log je pense
 
edit : ptet un truc genre  
 
find /tmp -iname *.mp3 -exec echo {} >> log \; -exec rm {} \;


 
Je connaissait pas cette façon se scripter, c'est quoi, du Batch? Tu as des liens avec des info là dessus que je potasse?

Reply

Marsh Posté le 24-03-2005 à 15:02:42    

nicephore17 a écrit :

Je connaissait pas cette façon se scripter, c'est quoi, du Batch? Tu as des liens avec des info là dessus que je potasse?


 
man find :D
 
Ce n'est pas du shell scripting en fait, pour vraiment faire appel au shell il aurait fallu un for i in `find blabla` do truc done
 
Mais find fournit une option -exec qui permet d'appliquer une commande pour chaque résultat de find (pour chaque fichier trouvé)... c'est pour ca que le -exec rm marche bien pour ce que tu veux faire ( {} est la "chaine" désignant le résultat de find )
 
En gros ma commande précédente suggère juste un find -exec toto -exec tata, et je m'aperçois que ca peut vraiment marcher en fait :D


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 24-03-2005 à 15:07:58    

find /root -iname \*.mp3 -print0 | xarg -0 rm

Reply

Marsh Posté le 24-03-2005 à 15:09:45    

Xavier_OM a écrit :

...man find :D...


 
 :jap:  
 
j'y avais pas pensé...

Reply

Marsh Posté le 24-03-2005 à 18:08:32    

m'intéresse!
 
Alors tu as pu tester les methodes décrites ci-dessus?


---------------
カエル
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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