2013-03-14 22 views
6

Codziennie przesłane przez użytkownika pliki starsze niż miesiąc są usuwane z serwera. Przesyłane przez użytkownika pliki są przechowywane w katalogach z dnia na dzień (np. /var/www/media/2013-03-13), dzięki czemu można łatwo zidentyfikować pliki/katalog, który należy usunąć.Batch usuń dużą liczbę plików

Problem: Usuwanie 100 000 plików na raz powoduje, że serwer przestaje odpowiadać i zajmuje dużo czasu. (Ubuntu 12.04 z 2x2TB ext4 SATA3 HDD w oprogramowaniu RAID1). W tej chwili PHP wykonuje exec na polecenie find /path/to/dir -maxdepth 1 -name '*' -delete.

Jak podzielić pliki wymagane do usunięcia? Wykonanie ls zajmie naprawdę dużo tych dużych katalogów.

Rozwiązanie nie musi być w PHP. Nie trzeba nawet dzielić plików na mniejsze partie.

Odpowiedz

2
  1. Znajdź katalogi dni chcesz zachować
  2. Znajdź katalogi wszystkich dni
  3. usuń 1. z 2.
  4. rm -rf katalogów można uzyskać z 3.

Nie jestem pewien, czy jest to szybsze niż metoda, ale unika jawnego wymieniania wszystkich plików w katalogach.

+0

Próbowałem 'rm -rfv dirname' oraz' find dirname -maxdepth 1 -print -delete', aby oba wypisywały nazwy plików podczas ich usuwania. W obu przypadkach lista usuniętych plików jest przesyłana strumieniowo na standardowe wyjście, po czym zawiesza się. 'df' pokazuje, że nie są już usuwane żadne pliki .... aż jakiś czas później, więcej plików zostanie usuniętych, a następnie zawiesza się ponownie – Nyxynyx

Powiązane problemy