Find + printf + contenu du fichier

Find + printf + contenu du fichier - Shell/Batch - Programmation

Marsh Posté le 19-10-2010 à 11:10:14    

Bonjour, je viens à me demander quelles alternatives préférer à la fonction scandir sur de gros fichiers..
Utiliser cette fonction avec +80000 fichiers .. le simple scandir met 80sec .. et fini par planter
Merci pour vos suggestions .. je pense que passer par le shell est la meilleure option ..


Message édité par grosbin le 05-11-2010 à 12:01:46

---------------
Photos Panoramiques Montagnes Haute Savoie
Reply

Marsh Posté le 19-10-2010 à 11:10:14   

Reply

Marsh Posté le 19-10-2010 à 11:17:33    

T'as 40000 fichiers dans un répertoire :??: Ton problème à résoudre serait plutôt de ce côté là... :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 19-10-2010 à 11:25:19    

Mouaip, donc en shell

Code :
  1. find . -name "*(crit1|crit2)*" -print | xargs rm


xargs => le paramètre simple n'est pas repérable par apostrophe => quésako ?
ou parfois j'ai : opérande manquante
et je ne vois pas comment supprimer les fichiers ayant pour mtime < 20 par exemple


Message édité par grosbin le 19-10-2010 à 11:49:45

---------------
Photos Panoramiques Montagnes Haute Savoie
Reply

Marsh Posté le 19-10-2010 à 11:45:02    

salut,

 

avec find, regarde du coté de "-exec"...

 

genre

Code :
  1. find . -name "*(crit1|crit2)*" -mtime 20 -exec rm {} \;
 

je te conseille de faire des echo au début pour pas faire n'imp...

Message cité 1 fois
Message édité par pataluc le 19-10-2010 à 11:45:13
Reply

Marsh Posté le 19-10-2010 à 11:52:59    

pataluc a écrit :

salut,
 
avec find, regarde du coté de "-exec"...
 
genre

Code :
  1. find . -name "*(crit1|crit2)*" -mtime 20 -exec rm {} \;


 
je te conseille de faire des echo au début pour pas faire n'imp...


 
L'option -delete est plus appropriée  :)

Reply

Marsh Posté le 19-10-2010 à 11:56:04    

roondar a écrit :


 
L'option -delete est plus appropriée  :)


ah ouais correct. J'avais l'habitude d'utiliser -exec pour diverses opération du coup je ne connaissais pas le -delete. :jap:

Reply

Marsh Posté le 19-10-2010 à 12:03:49    

arf il n'existe pas l'inverse de mtime ??
( qui dans ton exemple renvoie les 20 derniers jours ? )
pour rendre le -name case insensitive je fais comment ?


---------------
Photos Panoramiques Montagnes Haute Savoie
Reply

Marsh Posté le 19-10-2010 à 12:09:31    

grosbin a écrit :

arf il n'existe pas l'inverse de mtime ??
( qui dans ton exemple renvoie les 20 derniers jours ? )
pour rendre le -name case insensitive je fais comment ?


pour faire plus de 20 jours => -mtime +20
 
 -name case insensitive => -iname
 
bref, une bonne lecture de ca devrait t'aider http://pwet.fr/man/linux/commandes/find

Reply

Marsh Posté le 19-10-2010 à 12:14:29    

ah super merci à vous tous :jap:
j'utilise ces fichiers pour les redirections 301 et le mtime compte le nombre de hits sur l'url => redirection
afin d'établir une liste d'occurences les plus nombreuses et accélerer leur temps de traitement

 

en somme -mtime +1 = de 1970 à - 1 day
  mtime -1 = de 1970 au 2 janvier 1970
  mtime 1 = de maintenant à -1day
peut-on exprimer cette valeur en timestamp, qui représente ici mon nb de hits ?


Message édité par grosbin le 19-10-2010 à 12:25:13

---------------
Photos Panoramiques Montagnes Haute Savoie
Reply

Marsh Posté le 19-10-2010 à 12:21:01    

Citation :

-mtime n
    Fichier dont les données ont été modifiées il y a n*24 heures.  

Reply

Marsh Posté le 19-10-2010 à 12:21:01   

Reply

Marsh Posté le 19-10-2010 à 12:52:19    

Superbe j'obtiens un résultat 1000x plus rapide
Dernière question : peut-on trier le résultat de la fonction par filemtime DESC ou ASC ?


Message édité par grosbin le 19-10-2010 à 12:54:37

---------------
Photos Panoramiques Montagnes Haute Savoie
Reply

Marsh Posté le 19-10-2010 à 12:58:13    

Pas à ma connaissance, par contre essayes avec l'option printf

Reply

Marsh Posté le 19-10-2010 à 13:07:29    

Je suis vraiment gentil

Code :
  1. find . -type f -printf '%CD %CX %p \n'|sort -n


 
je te laisse adapter

Reply

Marsh Posté le 21-10-2010 à 14:06:29    

J'ai completé la commande qui me ravit à merveille, merci à tous :jap:

Code :
  1. find . -type f -iname '*' -printf '%T@ %p %s\n'|sort -r -n


Serait-ce possible d'ajouter le contenu du fichier "file_get_contents" à la place de %s ??
et si possible mettre un filtre négatif sur le nom ( * en excluant les fichiers "médias" ?? )

Code :
  1. find . -type f -regex '.*[^(jpg|JPG|gif|db|flv)]' -printf '%T@ %p %Contents\n'|sort -r -n


Cette commande exclut les lettres finales lettres par lettres soit : j|p|g|i|f|d|b|l|v => qui n'affiche donc pas les php ( arg )

 



Message édité par grosbin le 21-10-2010 à 14:32:22

---------------
Photos Panoramiques Montagnes Haute Savoie
Reply

Marsh Posté le 21-10-2010 à 14:54:30    

find . -type f  -regextype posix-egrep \! -iregex '.*\.(jpg|gif|bmp|png|swf|mp3|mp4|flv)$' -printf '%T@  %s\n'  -exec cat {} \;


Message édité par roondar le 21-10-2010 à 14:55:10
Reply

Marsh Posté le 21-10-2010 à 16:34:01    

:sweat: :s prédicat invalide : regextype


Message édité par grosbin le 21-10-2010 à 16:34:17

---------------
Photos Panoramiques Montagnes Haute Savoie
Reply

Marsh Posté le 25-10-2010 à 12:20:04    

Tu as sans doute un find ancien, qui ne supporte pas regextype. Ceci devrait coller, non:
find . \( -type f  ! -iregex '.*\.(jpg|gif|bmp|png|swf|mp3|mp4|flv)' \) -printf '%T@  %s\n'  -exec cat {} \;
au pire la regex est a adapter si la syntaxe ici n'est pas bonne.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 05-11-2010 à 10:11:30    

Superbe !! merci gilou ( passe avec les backslashes )
Dernière petite question : pour y associer le sort sur le printf, avec le -exec cat {}, how to do ?

Code :
  1. find . -type f -iregex '.*\.\(txt\|ini\)$' -printf '%T@ %p\n'|sort -r -n -exec cat {} \;


 ça ne passe pas encore :s


Message édité par grosbin le 05-11-2010 à 10:12:53

---------------
Photos Panoramiques Montagnes Haute Savoie
Reply

Marsh Posté le 05-11-2010 à 14:22:38    

Il faut peut être utiliser xargs.
A+,
 


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 05-11-2010 à 14:29:12    

tu m'as super aidé, au risque d'être lourd je ne connais pas la syntaxe de xargs, me semble juste qu'il sert à tunneler une info d'un part et d'autre ..


---------------
Photos Panoramiques Montagnes Haute Savoie
Reply

Marsh Posté le 05-11-2010 à 14:32:49    

C'était une réponse un peu bateau, car ceci:

Citation :

pour y associer le sort sur le printf, avec le -exec cat {}, how to do ?


c'est assez flou pour moi. Tu veux faire quoi exactement?
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 05-11-2010 à 14:40:24    

Code :
  1. find . -type f -iregex '.*\.\(txt\|ini\)$' -printf '%T@ %p\n'|sort -r -n -exec cat {} \;


en fait j'aimerais glisser le résultat de "-exec cat" à la suite de "%p" dans le printf

 

Mon but initial est de lister par timestamp desc deux types de fichiers, ainsi que leur contenu, pour éviter de passer par le file_get_contents de php à chaque fois
Ces fichiers me servent pour les redirections 301, erreur 404, debugging, bases de données sérialisées ( afin d'alléger la charge de mon serveur )
en passant par le shell, le temps de traitement de certaines infos, grace à tes remarques me fait gagner un temps précieux (x200) environ


Message édité par grosbin le 05-11-2010 à 14:42:31

---------------
Photos Panoramiques Montagnes Haute Savoie
Reply

Marsh Posté le 05-11-2010 à 14:57:31    

Mais que vient faire le sort dans tout cela?
 
parce que si tu pipes avec sort, -exec n'est plus dans la portée des arguments du find.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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