Эффективное удаление большого каталога, содержащего тысячи файлов

У нас проблема с папкой, которая становится громоздкой с сотнями тысяч крошечных файлов.

Есть так много файлов, которые выполняют rm -rf, возвращает ошибку, и вместо этого нам нужно что-то вроде:

find /path/to/folder -name "filenamestart*" -type f -exec rm -f {} \;

Это работает, но очень медленно и постоянно выходит из строя из-за нехватки памяти.

Есть ли лучший способ сделать это? В идеале я хотел бы удалить весь каталог, не заботясь о содержимом внутри него.

127 голосов | спросил Toby 26 AMpThu, 26 Apr 2012 11:50:04 +040050Thursday 2012, 11:50:04

14 ответов


157

Использование rsync удивительно быстро и просто.

mkdir empty_dir
rsync -a --delete empty_dir/    yourdirectory/

@ Ответ sarath упомянул еще один быстрый выбор: Perl! Его тесты быстрее, чем rsync -a --delete.

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

Источники:

  1. https://stackoverflow.com/questions/1795370 /Unix-быстро удалить-каталог-для чистки вверх-ежедневно создает
  2. http: //www. slashroot.in/which-is-the-fastest-method-to-delete-files-in-linux
ответил stevendaniels 17 J0000006Europe/Moscow 2013, 11:26:36
36

Кто-то на Twitter предложил использовать -delete вместо -exec rm -f{} \;

Это улучшило эффективность команды, но по-прежнему использует рекурсию, чтобы пройти через все.

ответил Toby 26 PMpThu, 26 Apr 2012 12:18:22 +040018Thursday 2012, 12:18:22
17

Как насчет чего-то вроде: find /path/to/folder -name "filenamestart*" -type f -print0 | xargs -0rn 20 rm -f

Вы можете ограничить количество удаляемых файлов сразу, изменив аргумент параметра -n. Имена файлов с пробелами также включены.

ответил digital_infinity 26 PMpThu, 26 Apr 2012 12:20:14 +040020Thursday 2012, 12:20:14
11

Развернувшись на одном из комментариев, я не думаю, что вы делаете то, что думаете, что делаете.

Сначала я создал огромное количество файлов, чтобы имитировать вашу ситуацию:

$ mkdir foo
$ cd foo/
$ for X in $(seq 1 1000);do touch {1..1000}_$X; done

Затем я попробовал то, что ожидал, чтобы потерпеть неудачу, и как это звучит, как будто вы делаете в вопросе:

$ rm -r foo/*
bash: /bin/rm: Argument list too long

Но это работает :

$ rm -r foo/
$ ls foo
ls: cannot access foo: No such file or directory
ответил Izkata 26 PMpThu, 26 Apr 2012 18:04:46 +040004Thursday 2012, 18:04:46
8

Умный трюк:

rsync -a --delete empty/ your_folder/

Это супер-процессор, но очень быстро. См. https://web.archive.org/web/20130929001850/http://linuxnote.net/jianingy/en/linux/a-fast-way-to-remove-huge- число-files.html

ответил MZAweb 31 AM00000080000003031 2013, 08:13:30
6

У меня была возможность протестировать -delete по сравнению с -exec rm \{\} \; и для меня -delete был ответ на эту проблему.

Использование -delete удаляет файлы в папке из 400 000 файлов по меньшей мере в 1000 раз быстрее, чем rm.

В статье «Как удалить большое количество файлов в Linux» говорится, что это примерно в три раза быстрее, но в моем тесте разница была гораздо более драматичной.

ответил user2365090 2 J000000Tuesday13 2013, 17:17:26
3

Существует несколько методов, которые можно использовать для удаления большого количества файлов в Linux. Вы можете использовать опцию find with delete, которая быстрее, чем опция exec. Затем вы можете использовать perl unlink, а затем rsync. Как удалить большое количество файлов в Linux

ответил sarath 15 J0000006Europe/Moscow 2013, 15:39:58
2

О опции -delete выше: я использую ее для удаления большого количества файлов (1M + est) во временную папку, которую я создал, и непреднамеренно забыл очистить каждую ночь. Я случайно заполнил свой диск /раздел, и ничто не могло их удалить, но команда find .. Это медленно, сначала я использовал:

find . -ls -exec rm {} \;

Но это заняло Чрезвычайное количество времени. Он начался примерно через 15 минут, чтобы удалить некоторые файлы, но я предполагаю, что он удалял менее 10 или около того в секунду после того, как он наконец начал. Итак, я попробовал:

find . -delete

вместо этого, и я разрешаю ему запускать прямо сейчас. Похоже, что он работает быстрее, хотя на ЦПУ EXTREMELY накладывается так, что другой командой не было. Он работает как час, и я думаю, что снова получаю пространство на своем диске, и раздел постепенно «похудит», но он все еще занимает очень много времени. Я серьезно сомневаюсь, что он работает в 1000 раз быстрее, чем другой. Как и во всем, я просто хотел указать на компромисс в пространстве и времени. Если у вас есть пропускная способность центрального процессора (мы делаем), тогда запустите последнюю. У моего процессора работает (uptime):

10:59:17 up 539 days, 21:21,  3 users,  load average: 22.98, 24.10, 22.87

И я видел, что средняя нагрузка превышает 30,00, что плохо для занятой системы, но для наших, которые обычно легко загружаются, все в порядке на пару часов. Я проверил большинство других вещей в системе, и они все еще реагируют, поэтому теперь все в порядке.

ответил Scotty 31 TueEurope/Moscow2013-12-31T23:00:34+04:00Europe/Moscow12bEurope/MoscowTue, 31 Dec 2013 23:00:34 +0400 2013, 23:00:34
1

Удаление ДЕЙСТВИТЕЛЬНО БОЛЬШИХ каталогов требует другого подхода, поскольку я узнал из этого сайта - вам нужно будет использовать ionice.It гарантирует (с -c3), что удаление будет выполняться только тогда, когда система имеет время ввода-вывода. Нагрузка на систему не повышается до максимума, и все остается отзывчивым (хотя время моего процессора для поиска было довольно высоким примерно на 50%).

find <dir> -type f -exec ionice -c3 rm {} \;
ответил gamma 10 Mayam13 2013, 10:51:12
1

Рассмотрите возможность использования тома Btrfs и просто удалите весь том для такого каталога с большим количеством файлов.

В качестве альтернативы вы можете создать файл изображения FS, затем отключите и удалите его файл, чтобы удалить все сразу очень быстро.

ответил Sergei 27 FebruaryEurope/MoscowbMon, 27 Feb 2017 18:46:38 +0300000000pmMon, 27 Feb 2017 18:46:38 +030017 2017, 18:46:38
1

Предполагая, что GNU parallel установлен, я использовал это:

parallel rm -rf dir/{} ::: `ls -f dir/`

, и это было достаточно быстро.

ответил Nacho 3 +03002017-10-03T03:41:06+03:00312017bEurope/MoscowTue, 03 Oct 2017 03:41:06 +0300 2017, 03:41:06
0
ls -1 | xargs rm -rf 

должен работать внутри основной папки

ответил PsyStyle 26 PMpThu, 26 Apr 2012 12:17:14 +040017Thursday 2012, 12:17:14
0

Для подсказки Izkata выше:

  

Но это работает :

$ rm -r foo/
$ ls foo
ls: cannot access foo: No such file or directory

Это почти сработало - или сработало бы - но у меня возникли проблемы с разрешением; файлы были на сервере, но все же я не понимаю, откуда эта проблема разрешений. В любом случае, терминал запрашивал подтверждение для каждого файла. Количество файлов было около 20 000, так что это был не вариант. После «-r» я добавил параметр «-f», поэтому вся команда была « rm -r -f имя_папки /". Тогда это, казалось, сработало. Я новичок в терминале, но, думаю, все в порядке, не так ли? Спасибо!

ответил user41527 20 J0000006Europe/Moscow 2013, 09:42:30
0

В зависимости от того, насколько хорошо вам нужно избавиться от этих файлов, я бы предложил использовать shred.

$ shred -zuv folder

, если вы хотите очистить каталог, но вы не можете удалить его и воссоздать, я предлагаю переместить его и мгновенно восстановить его.

mv folder folder_del
mkdir folder
rm -rf folder_del

это быстрее, верьте или нет, так как нужно изменить только один индекс. Помните: вы не можете распараллелить этот вкус на многоядерном компьютере. Это сводится к доступу к диску, который ограничен RAID или что у вас есть.

ответил polemon 2 J000000Tuesday13 2013, 17:56:28

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132