Видалення мільйонів файлів


38

У мене був рейтинг, поповнився мільйонами графічних зображень. Забагато для команди rm.

Я намагався знайти команду так:

find . -name "*.gif" -print0 | xargs -0 rm

Проблема полягає в тому, що вона дуже погано вибиває мою машину і викликає у клієнтів тайм-аути, оскільки це сервер.

Чи є спосіб швидше видалити всі ці файли ... без блокування машини?


Я "зі швидкістю видалення близько 6 гб / год за допомогою команди" nice find ", наведеної нижче. Напевно, знадобиться 48 годин прямо, щоб позбутися від усіх файлів. Причиною цього сталося те, що сценарій b / ca scour не вдався. Я перевершив "горизонт події" з командою rm, потім він втік.

3
Чи не було б вилучення всього режиму суттєво швидше? Просто вийміть "хороші" файли, перш ніж вилучити решту ...
tucuxi

Ну, кожен файл зараз поганий, тому що його перемістили в / dir_old, і я переробив / dir. Але чи не буде rmdir мати таке ж обмеження, як rm *?

@Corepuncher: Я б очікував, що видалення всього каталогу (як rm -rfби було швидше. Варто спробувати.
Jason R

Я зараз біжу "rm -rf" на dir. Зараз він працює вже понад 20 хв ... ще не змінилося розмір диска. Але також також автоматично не повернувся "аргументаційний список занадто довгий". Проблема полягає лише в тому, що це дійсно забиває мою машину і робить інші речі повільними / виходять з ладу. Не впевнений, як довго його відпустити.

Відповіді:


44

Швидше - це не обов'язково те, що ви хочете. Можливо, ви хочете реально працювати повільніше , тому видалення жує менше ресурсів під час роботи.

Використовуйте nice (1), щоб знизити пріоритет команди.

nice find . -name "*.gif" -delete

Для процесів, пов'язаних з входом / виводом, nice (1) може бути недостатньо. Планувальник Linux враховує введення-виведення не лише CPU, але вам може знадобитися більш тонкий контроль над пріоритетом вводу-виводу.

ionice -c 2 -n 7 find . -name "*.gif" -delete

Якщо цього не зробити, ви також можете додати сон, щоб дійсно уповільнити його.

find . -name "*.gif" -exec sleep 0.01 \; -delete

3
ух ... мільйони файлів із сном .1 с ... потрібно в день для 864000 файлів.
glglgl

7
@glglgl Добре, розумна дупа. Я змінив тайм-аут. :-P
Джон Кугельман підтримує Моніку

28
Сон може бути хорошим вибором, але приємного не буде, оскільки завдання тут пов'язане з IO, а не з процесором; ви можете спробувати ionice замість цього. Зауважте, що якщо сон занадто малий, він буде марний.
Маттео Італія

3
@glglgl: Справа саме в тому, що якщо ви не хочете викликати збоїв у роботі сервера, вам доведеться йти повільно, час, коли цей код спить, є там, щоб сервер міг корисно працювати з диском.
Маттео Італія

1
+1 для sleepдоповнення - Незважаючи на використання, у мене виникли проблеми із задушенням серверів IO ionice -c 3. Це суттєво додає часу, необхідного для очищення файлів (звичайно), але я б краще зачекати, ніж збити програму ...
Ola Tuvesson

22

Оскільки у вас працює Linux, і це завдання, мабуть, пов'язане з входом / виводом, я раджу надати вашому команду пріоритет планувальника вводу-виводу, використовуючи ionice(1):

ionice -c3 find . -name '*.gif' -delete

Якщо порівнювати з початковою командою, то, мабуть, це може пошкодити ще декілька циклів процесора, уникаючи переходу xargs.


@Braiam Що ти маєш на увазі? Це не find ... -execмає сенсу.

О, так, вибачте. Моє ліжко. Ви впевнені, що це ефективно, тхо?
Брайам

1
Ну, find(1)документація так стверджує. :) І повинно бути очевидним, що дозволяти findсобі видаляти файли ефективніше, ніж форсувати rmкоманду для цього.

1
Я спробував кілька запропонованих версій у папці з 4 мільйонами файлів на виробничому сервері, і ця єдина, яка не задушує систему. ionice -c3знижує пріорі просто працювати, коли IO в режимі очікування, інакше це ідеально. Зауважте, що оскільки -deleteце не є стандартним для пошуку, ви можете зробити те ж саме (включаючи відгуки про те, що він працює), використовуючи цю команду: ionice -c 3 find . -name '*.gif' -exec echo {} \; -exec rm {} \;- Повільне, але не очікування важливих процесів.
Крістофер Льоркен

13

Ні.

Більш швидкого шляху немає, вийдіть з м'якого формату диска. Файли отримують rm одразу (до межі командного рядка, це також можна встановити до xargs), що набагато краще, ніж викликати rm у кожному файлі. Так що ні, швидшого шляху точно немає.

Використання nice(або reniceзапущеного процесу) допомагає лише частково, адже це призначено для планування ресурсу процесора , а не диска! І використання процесора буде дуже низьким. Це слабкість Linux - якщо один процес "з'їдає" диск (тобто багато працює з ним), вся машина застряє. Модифіковане ядро ​​для використання в режимі реального часу може бути рішенням.

Що я б робив на сервері - це вручну дозволити іншим процесам виконувати свою роботу - включити паузи, щоб сервер "дихав":

find . -name "*.gif" > files
split -l 100 files files.
for F in files.* do
    cat $F | xargs rm
    sleep 5 
done

Це зачекатиме 5 секунд після кожні 100 файлів. Це займе набагато більше часу, але ваші клієнти не повинні помічати затримок.


"Файлам надається rm одразу (до межі командного рядка" - тому, коли оболонці призначено rm *, вона розширюється *у рядок зі всіма іменами і передає її rm? Це неймовірно нерозумно. Чому б оболонка розширити шаблони?

:-D @Joker_vD, ти жартуєш, як підказує твоє ім’я? :-)
Томаш

2
@Joker_vD: Сумісність з рішенням Unix від 1970 року або більше. Windows не робить цього. Там програми можуть передавати підстановку на FindNextFile / FindNextFile, тому вони отримують результати по черзі.
MSalters

@Tomas Не в цьому випадку. Чесно кажучи, я одразу бачу дві проблеми з такою конструкцією: по-перше, командний рядок не гумовий; по-друге, програма не може визначити, чи викликали її *або /*не викликає сумнівів у такому рішенні користувача.

1
@Joker_vD Є багато хороших речей щодо оболонки, що робить розширення wildcard. Це відмінність від Windows, але не варто підходити до висновку, що це неймовірно дурно лише тим, що воно відрізняється від того, до чого ви звикли. Якщо ви хочете дізнатися більше, я рекомендую вам надіслати його Google або опублікувати питання на відповідному сайті Stack Exchange. Це величезна рента для цієї області коментарів.
Джон Кугельман підтримує Моніку

5

Якщо кількість файлів, які потрібно видалити, значно перевищує кількість залишених файлів, можливо, це не найефективніший підхід до дерева файлів, які потрібно видалити, та всіх оновлень файлової системи. (Це аналогічно виконанню незграбного керування пам’яттю з посиланням, відвідування кожного об'єкта у великому дереві, щоб скинути його посилання, замість того, щоб все небажане переносити на сміття за один крок, а потім перебирати те, що можна прибрати для очищення.)

Тобто, клонуйте частини дерева, які слід зберегти в іншому обсязі. Заново створіть свіжу, порожню файлову систему на вихідному томі. Скопіюйте збережені файли назад у початкові контури. Це нечітко схоже на копіювання збору сміття .

Буде якийсь час простоїв, але це може бути краще, ніж постійні погані показники роботи та сервіс.

У вашій системі та ситуації це може бути непрактично, але легко уявити очевидні випадки, коли це саме шлях.

Наприклад, припустимо, ви хотіли видалити всі файли з файлової системи. Що було б сенсом повторювати та видаляти один за одним? Просто відключіть його і зробіть "mkfs" над розділом, щоб створити порожню файлову систему.

Або припустимо, ви хотіли видалити всі файли, крім півдюжини важливих? Дістаньте звідти півдюжини і ... "mkfs" зверху.

Зрештою, існує певна точка беззбитковості, коли достатньо файлів, які повинні залишитися, стає дешевше робити рекурсивне видалення з урахуванням інших витрат, як-от будь-який час простою.


4

Ти намагався:

find . -name "*.gif" -exec rm {} +

Знак + в кінці призведе до знаходження додаткового числа файлів для виконання однієї команди rm. Перегляньте це питання для отримання більш детальної інформації.


Він виконується набагато швидше, ніж -print0 | xargs рішення, тому що процес rm викликається не для кожного файлу, а для великого набору, тому він спричиняє меншу навантаження.

@JohnKugelman Ви маєте рацію, але це розширення GNU, яке не завжди доступне з нативної командою пошуку .
CodeGnome

Добре, цікаво, але це зовсім нова річ (як і -delete), яка не завжди повинна бути там ..
Томаш

Однак це, безумовно, не приносить нічого кращого порівняно з рішенням ОП.
Томаш
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.