Re: Effacer plusieurs millions de fichiers d'un répertoire !

2021-04-04 Par sujet Fabrice Bauzac-Stehly
Jean-Damien Durand  writes:

> find /tmp -cmin +30 -type f -exec rm -f {} \;

Utilise -delete pour que ca aille plus vite:

  find /tmp -cmin +30 -type f -delete

-- 
Fabrice Bauzac-Stehly
PGP 01EEACF8244E9C14B551C5256ADA5F189BD322B6
old PGP 015AE9B25DCB0511D200A75DE5674DEA514C891D



Re: HS: petite question bash et variable en argument d'une commande

2021-04-04 Par sujet l0f4r0
Hello,

25 mars 2021, 09:02 de m...@unistra.fr:

>> Comme indiqué de manière très détaillée sur 
>> https://mywiki.wooledge.org/BashFAQ/050
>>
> (désolé c'est en anglais), stocker des commandes dans des variables est très 
> hasardeux.
>
> je ne lit plus jamais qu'en diagonale toute litterature spécifique à
> bash mais oui: les choses sont compliquées voir impossibles dans une
> chaine. par contre ...
>
>> La façon la moins risquée est de passer par un tableau (d'ailleurs
>> t'avais évoqué l'idée dans ton message initial).
>>
>
> non!
> [...]
> ensuite: la façon la moins risquée s'appelle une fonction et c'est même
> fait pour. ca permet de surcroit de profiter
>
> * de la localisation des variables dans le contexte de la fonction.
> * du paramétrage d'une valeur par défaut
>
Je parlais du cas où l'on souhaiterait absolument passer par une variable. Vaut 
mieux le tableau que la chaîne.
Nous sommes en phase sur la fonction.

> autre manière de faire pour éviter le quoting hell: xargs
> https://pubs.opengroup.org/onlinepubs/9699919799/utilities/xargs.html
>
> date=tomorrow
>
> # des trucs ...
>
> <<. xargs -d'\n' date
> -d ${date:--1day}
> +%A %d %B
> .
>
> xargs prend aussi un fichier, du coup tu peux composer ta commande
> petit à petit
>
> exec 9>/tmp/mydate
> >&9 echo "-d ${date:--1day}"
> >&9 echo '+%A %d %B'
> exec 9>&-
> xargs -a /tmp/mydate -d'\n' date
>
Merci, ça m'a fait réviser xargs et les redirections/descripteurs de fichiers 
non standards ;)

25 mars 2021, 19:14 de k6dedi...@free.fr:

> Pour info : tutorial bash
> http://aral.iut-rodez.fr/fr/sanchis/enseignement/bash/
>
Oui, ce cours est vraiment top je trouve.
Je l'avais massivement utilisé à mes débuts en bash !

Bonne fin de journée
l0f4r0



Re: Effacer plusieurs millions de fichiers d'un répertoire !

2021-04-04 Par sujet didier gaumet

Le 04/04/2021 à 09:30, JUPIN Alain a écrit :
[...]
[4958833.739887] EXT4-fs warning (device sda3): ext4_dx_add_entry:2258: 
Directory (ino: 18612230) index full, reach max htree level :2
[4958833.739889] EXT4-fs warning (device sda3): ext4_dx_add_entry:2262: 
Large directory feature is not enabled on this filesystem

[...]

j'ai l'impression que tu peux supprimer ces deux warnings en activant 
l'option large_dir dans /etc/fstab pour ce montage particulier (tu peux 
aussi le faire à chaud par un tune2fs mais cela devrait être

 perdu au prochain montage)

cf les manpages de etx4 et tune2fs ainsi que ce lien:

https://pzel.name/til/2020/08/30/Large-directory-feature-not-enabled-on-this-filesystem.html



Re: Effacer plusieurs millions de fichiers d'un répertoire !

2021-04-04 Par sujet l0f4r0
4 avr. 2021, 10:39 de bas...@starynkevitch.net:

>
> On 4/4/21 10:29 AM, JUPIN Alain wrote:
>
>
>>   Par contre lancer 56 millions de fois la copmmande rm, ca risque  de 
>> prendre un temps de dingue, mais avec -print on a au moins  l'impression 
>> que "ca avance" lol
>>
>
> Sur un PC moderne, le lancé d'un processus prend quelques  millisecondes. 
> Donc 56 millions de fois, ca prendra quelques  heures.
>
>
En parlant de perfs, je pense Alain que t'y gagnerais probablement en utilisant 
également l'option `-P` de xargs (en coordination avec `-n`).

Après faut voir si ton processeur le permet mais l'idée est de paralléliser les 
process lancés par xargs.

Vu la volumétrie concernée, ça peut faire gagner du temps :)

l0f4r0



Re: Effacer plusieurs millions de fichiers d'un répertoire !

2021-04-04 Par sujet Basile Starynkevitch


On 4/4/21 10:29 AM, JUPIN Alain wrote:

Le 04/04/2021 à 09:50, Jean-Damien Durand a écrit :


Sans prétendre que ce soit plus rapide, tu n'auras pas le problème de 
"trop d'arguments" en faisant:


    find /tmp -cmin +30 -type f -exec rm -f {} \;

Tu peux rajouter -print pour le voir avancer.

J'ai rajouté -type f puisque tu ne parles que de fichiers.



Je me demande en le lisant pourquoi je n'y ai même pas pensé

Par contre lancer 56 millions de fois la copmmande rm, ca risque de 
prendre un temps de dingue, mais avec -print on a au moins 
l'impression que "ca avance" lol



Sur un PC moderne, le lancé d'un processus prend quelques millisecondes. 
Donc 56 millions de fois, ca prendra quelques heures.


Une alternative est bien sûr d'*améliorer* le code d'un *shell existant 
codé* en C.


Par exemple GNU bash  ou zsh 
 ... On peut aussi modifier sash 
 


Ou lire /Advanced Linux Programming/ 
 (en 
anglais) et utiliser nftw(3) 
 avec unlink(2) 
 et d'autres 
syscalls(2) 



--


Basile Starynkevitch  
(only mine opinions / les opinions sont miennes uniquement)
92340 Bourg-la-Reine, France
web page: starynkevitch.net/Basile/



Re: Effacer plusieurs millions de fichiers d'un répertoire !

2021-04-04 Par sujet JUPIN Alain

Le 04/04/2021 à 10:10, l0f...@tuta.io a écrit :

4 avr. 2021, 10:02 de l0f...@tuta.io:


Tu peux limiter le nb de ses arguments par commande lancée en utilisant 
l'option `-n`.

Tant que t'y es, pour garder un œil sur les commandes générées, t'as qu'à aussi 
utiliser l'option `-t`.


Précision : je parle des options de `xargs`

l0f4r0



Merci pour l'info, j'avoue que je ne connaissais pas cette astuce (n'en 
ayant jamais eu le besoin jusqu'à maintenant).


Alain JUPIN
Lumières d'Ici ... et d'Ailleurs 


Re: Effacer plusieurs millions de fichiers d'un répertoire !

2021-04-04 Par sujet JUPIN Alain

Le 04/04/2021 à 09:50, Jean-Damien Durand a écrit :


Sans prétendre que ce soit plus rapide, tu n'auras pas le problème de 
"trop d'arguments" en faisant:


    find /tmp -cmin +30 -type f -exec rm -f {} \;

Tu peux rajouter -print pour le voir avancer.

J'ai rajouté -type f puisque tu ne parles que de fichiers.



Je me demande en le lisant pourquoi je n'y ai même pas pensé

Par contre lancer 56 millions de fois la copmmande rm, ca risque de 
prendre un temps de dingue, mais avec -print on a au moins l'impression 
que "ca avance" lol



Cordialement, Jean-Damien.




Merci

Alain JUPIN
Lumières d'Ici ... et d'Ailleurs 


Re: Effacer plusieurs millions de fichiers d'un répertoire !

2021-04-04 Par sujet l0f4r0
4 avr. 2021, 10:02 de l0f...@tuta.io:

> Tu peux limiter le nb de ses arguments par commande lancée en utilisant 
> l'option `-n`.
>
> Tant que t'y es, pour garder un œil sur les commandes générées, t'as qu'à 
> aussi utiliser l'option `-t`.
>
Précision : je parle des options de `xargs`

l0f4r0



Re: Effacer plusieurs millions de fichiers d'un répertoire !

2021-04-04 Par sujet l0f4r0
Bonjour,

Désolé, je n'ai pas mieux que `find/rsync` pour réaliser ta tâche massive de 
suppression.

Quelques remarques ci-dessous cependant :

4 avr. 2021, 09:30 de aju...@jupin.net:

> par contre, le répertoire/var/lib/php/sessions/ contient 56 781 542 
> fichiers
>  J'ai lancé hier soir un : find . -cmin +30 | xargs rm;
>  Mais après plusieurs heures la commande échoue avec "tropd'arguments"
>
Oui, pas étonnant, le `rm` se retrouve avec bien trop d'arguments de la sorte.

Tu peux limiter le nb de ses arguments par commande lancée en utilisant 
l'option `-n`.

Tant que t'y es, pour garder un œil sur les commandes générées, t'as qu'à aussi 
utiliser l'option `-t`.

Je ferais aussi gaffe à certains caractères ('\n'...) dans les noms de fichiers 
qui peuvent faire foirer le `rm`.
Donc j'utiliserais également `find -print0 | xargs -0`.
Par ailleurs, certains commentaires sur internet semblent indiquer que passer 
par `find -delete` serait plus rapide que `find | xargs rm`.
Tu peux peut-être essayer ?

>   Bref ce matin, il y a deux heures, je tente une nouvelle approche :
> rsync -a --delete /tmp/empty/ /var/lib/php/sessions/
>  avec bien sur /tmp/empty qui est vide
>  Mais après deux heures de fonctionnement, je n'ai aucun retour de la
> commande !
>
Ingénieux.
Pour l'histoire du retour manquant, t'as qu'à ajouter l'option `-v`.

l0f4r0



Re: Effacer plusieurs millions de fichiers d'un répertoire !

2021-04-04 Par sujet Jean-Damien Durand

Bonjour Alain,


Sans prétendre que ce soit plus rapide, tu n'auras pas le problème de 
"trop d'arguments" en faisant:


    find /tmp -cmin +30 -type f -exec rm -f {} \;

Tu peux rajouter -print pour le voir avancer.

J'ai rajouté -type f puisque tu ne parles que de fichiers.


Cordialement, Jean-Damien.


On 4/4/21 9:30 AM, JUPIN Alain wrote:

Bonjour

Petit casse tête du dimanche matin !

Sur un serveur LAMP à base de Debian10 (à jour en version 10.9), j'ai 
noté des lenteurs et le syslog est sans équivoque :
[4958833.739887] EXT4-fs warning (device sda3): 
ext4_dx_add_entry:2258: Directory (ino: 18612230) index full, reach 
max htree level :2
[4958833.739889] EXT4-fs warning (device sda3): 
ext4_dx_add_entry:2262: Large directory feature is not enabled on this 
filesystem


Après analyse, je ne dépasse pas le nombre max d'inodes du système de 
fichier (j'en suis à 9% d'utilisé), par contre, le répertoire 
/var/lib/php/sessions/ contient 56 781 542 fichiers

J'ai lancé hier soir un : find . -cmin +30 | xargs rm;
Mais après plusieurs heures la commande échoue avec "trop d'arguments"

Bref ce matin, il y a deux heures, je tente une nouvelle approche : 
rsync -a --delete /tmp/empty/ /var/lib/php/sessions/

avec bien sur /tmp/empty qui est vide
Mais après deux heures de fonctionnement, je n'ai aucun retour de la 
commande !


Du coup connaissez vous une méthode "rapide" pour effacer plusieurs 
millions de fichiers d'un répertoire !


PS : Par contre, je ne comprend pas la présence de ses fichiers, car 
j'ai bien un cron qui se lance toutes les demi-heures pour supprimer 
les sessions. Va falloir que j'élucide ce mystère !



--
Alain JUPIN
Lumières d'Ici ... et d'Ailleurs 


Re: ...

2021-04-04 Par sujet JUPIN Alain
Bon là je comprend pas l'envoi de ce message incomplet ... envoie qui 
s'est fait durant la rédaction du mon message complet !

Désolé pour le bruit, j'ai du faire une fausse manip :/

Alain JUPIN
Lumières d'Ici ... et d'Ailleurs 

Le 04/04/2021 à 09:22, JUPIN Alain a écrit :

Bonjour

Petit casse tête du dimanche matin !

Sur un serveur LAMP à base de Debian10 (à jour en version 10.9), j'ai 
noté des lenteurs

Le syslog me renvoie

Après analyse, je ne dépasse pas le nombre max d'inodes du système de 
fichier, par contre, le répertoire /var/lib/php/sessions contient 

--
Alain JUPIN
Lumières d'Ici ... et d'Ailleurs 




Effacer plusieurs millions de fichiers d'un répertoire !

2021-04-04 Par sujet JUPIN Alain

Bonjour

Petit casse tête du dimanche matin !

Sur un serveur LAMP à base de Debian10 (à jour en version 10.9), j'ai 
noté des lenteurs et le syslog est sans équivoque :
[4958833.739887] EXT4-fs warning (device sda3): ext4_dx_add_entry:2258: 
Directory (ino: 18612230) index full, reach max htree level :2
[4958833.739889] EXT4-fs warning (device sda3): ext4_dx_add_entry:2262: 
Large directory feature is not enabled on this filesystem


Après analyse, je ne dépasse pas le nombre max d'inodes du système de 
fichier (j'en suis à 9% d'utilisé), par contre, le répertoire 
/var/lib/php/sessions/ contient 56 781 542 fichiers

J'ai lancé hier soir un : find . -cmin +30 | xargs rm;
Mais après plusieurs heures la commande échoue avec "trop d'arguments"

Bref ce matin, il y a deux heures, je tente une nouvelle approche : 
rsync -a --delete /tmp/empty/ /var/lib/php/sessions/

avec bien sur /tmp/empty qui est vide
Mais après deux heures de fonctionnement, je n'ai aucun retour de la 
commande !


Du coup connaissez vous une méthode "rapide" pour effacer plusieurs 
millions de fichiers d'un répertoire !


PS : Par contre, je ne comprend pas la présence de ses fichiers, car 
j'ai bien un cron qui se lance toutes les demi-heures pour supprimer les 
sessions. Va falloir que j'élucide ce mystère !



--
Alain JUPIN
Lumières d'Ici ... et d'Ailleurs