Stergere numar mare de fisiere dintr-un director in Linux

Salut!

In diferite foldere am un numar mare de fisiere care se aduna si vreau sa le sterg.

Cum as putea face acest lucru in mod mai eficient?
Eu folosesc rm nume_fisier_*, dar ori dureaza prea mult, ori foloseste prea mult cpu, ori imi zice ca
Argument list too long

De asemenea ar fi util ca metoda sa aiba si o plasa de siguranta. Nu se stie niciodata :wink:

Pana acum am gasit ca pot folosi rsync

EMPTYDIR=$(mktemp -d)
rsync -r --delete $EMPTYDIR/ dir_to_be_emptied/

https://www.quora.com/File-Systems/How-can-someone-rapidly-delete-400-000-files

LE: Vreau sa pastrez folderul. Este folosit in scripturi.

rm -rf <folder> ajuta?

Este buna ideea, dar vreau sa pastrez folder-ul.

pai poate e mai simplu stergerea folderului si apoi recreerea lui :smiley: asa mai procedam cu tabelele din mssql, decat sa astept sa stearga toate datele, stergeam tabela si o recream :))

  • daca sunt mai putine fisierele care trebuiesc pastrate (si pot fi identificate cumva), le poti muta intr-un nou folder, pe care il redenumesti dupa stergerea celuilalt

find $dir -type d | xargs rm -f

rm -rf /path/to/*

Nu stiu ce inseamna multe pentru tine, dar la ~10k ii ia cateva secunde.

Mai am si alte directoare pe care vreau sa le sterg in /path/to/, de aia cu ‘-rf’.


find . -type f -exec rm -f “{}” \”;

Merci pentru sugestii.
Maine testez si revin cu feedback. :slight_smile:

Poți folosi un for și să pui condiții… A fost un proiect în care am automatizat câteva comenzi în Ubuntu. Este cam complicat, but serves your need.

find are -delete; nu vad in OP sa fie specificat vreun force nicaieri, doar in restul comentariilor. Nici de recursiv nu vad sa fie cazul.

Asa este!
Nu fac rercursiv.

Pana la urma am gasit si incercat acesta varianta, in Perl

perl -e 'for(<"name_pattern_*">){((stat)[9]<(unlink))}'

Se poate scrie si mai frumos si in loc de * se poate specifica un pattern. Merge destul de bine pe ce am eu. Este bun pt fisiere in foldere gen /alt_director/tmp (nu tmp-ul din Linux). Am testat varianta in Perl pe 100k fisiere create de mine si a dat rezultate bune.

for i in {000..100}
do
    echo hello > "File${i}.txt"
done

Am discutat si cu un coleg mult mai experimantat decat mine si asupra variantei cu rsync si mi-a zis ca duce procesorul in 100%.

@sorin19, pe weekend s-au strans in jur de 10 mii si un pic de fisiere. Am scripturi care colecteaza niste statistici si folosesc acel folder pe post de loc intermediar pentru procesarea lor. Ruleaza din 15 in 15 minute si daca las pe weekend se strrange destul de mult.

O sa ma uit prin script sa vad ce pot face.

Merci frumos pentru idei. Topicul ramane deschis pentru discutii conexe :slight_smile:

Din llink-ul de mai jos am luat varianta cu Perl. Sunt si niste comparatii.

1 Like

Da, rsync face compresie, calculeaza hash-uri, lucruri de care nu prea ai nevoie la stergere.
[E destul de posibil sa nu fi inteles eu care e cerinta, sau poate nu m-a mi s-a parut niciodata ca dureaza prea mult si sa fiu nevoit sa caut o alta solutie]

Dacă ai scripturi care nu își șterg fișierele vechi, mai fa unu.
Activează-l în systemd sa ruleze din 30 in 30 min. Să șteargă ce nu te interesează, așa nu se mai acumulează fișiere inutile.

Am folosit scriptul azi pe un director cu vreo 342 de mii de fisiere text. Toata treaba a durat injur de 24 de minute si cpu load a fost pana in 40%.

real    24m49.726s
user    0m1.005s
sys     0m14.156s

Destul de onorabil as zice. :slight_smile:


Morala povestii:
Nu lasati sa se adune fisiere :))

Eu folosesc unlink din PHP pentru stergerea fisierelor din 3 foldere, o data pe luna.
M-am uitat la un singur folder din cele 3 si avea 143k fisiere. Am rulat comanda manual, si in 3 secunde a terminat.

// tmp folder
$fst = glob('/var/www/calc_data/draw_data/tmp/*');
    
foreach($fst as $ft){
    if(is_file($ft)) {
        unlink($ft);
    }
}

Nu inteleg cum stai tu 24 minute pentru 342k.

LE: Partitia este ext4.

1 Like

Pentru ca tu nu pare sa verifici nici numele fisierului nici data creerii.

1 Like

Nu vad nimic de nici o data a creării.
Ca sa verifici un name pattern nu cred ca iti ia inca 24 minute.

1 Like