1 (29.08.2011 18:18:40 отредактировано aka)

Понимаю, что тема стара как мир, но все же осмелюсь:)

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

Собственно проблема в том, что там около 2-3 миллионов файлов и это продакшн.

Руки чесали на find, но понимаю find делает сначала листинг, а потом только работает, что по мнению пробовавших около недели или больше при таких объемах) Сам я еще не пробовал, если честно...

Куда смотреть, что бы корректно удалить все это множество?:)

2

rm */*/*

мне кажется так можно...

iMac 21.5, Asus U36JC, iPad 2, iPhone 4S

3

aka пишет:

Руки чесали на find, но понимаю find делает сначала листинг, а потом только работает, что по мнению пробовавших около недели или больше при таких объемах)

вас ввели в заблуждение: find сразу удаляет (find -delete).

zvezdochots пишет:

rm */*/*
мне кажется так можно...

а вот тут будет листинг в памяти (много гигов ОЗУ потрачено будет), а потом уже удаление.
и каталоги тоже убьёте. Что недопустимо по условию.

aka пишет:

Куда смотреть, что бы корректно удалить все это множество?:)

man find

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

4

Для рекурсивного копирования файлов (на примере телефонов Nokia) использую такой скрипт:

 Консоль:
find <old-catalog> -type f -name '*' | xargs cp -t <new-catalog>

Нашёл здесь
Для удаления можно составить аналогично. Опции для поиска определённых типов файлов есть в man find

5

drBatty пишет:

а вот тут будет листинг в памяти (много гигов ОЗУ потрачено будет), а потом уже удаление.
и каталоги тоже убьёте. Что недопустимо по условию.

не говоря уже о том, что вообще не заработает.... скажет, что мол слишком много аргументов...

95% процентов проблем находятся между клавиатурой и стулом.

6

Удалял, как и Ranyar, при помощи find + xargs

Black-metal ist krieg!
Hochlast ist krieg!

7

Ranyar пишет:

Для рекурсивного копирования файлов (на примере телефонов Nokia) использую такой скрипт:
Консоль:

find <old-catalog> -type f -name '*' | xargs cp -t <new-catalog>

выделенное лишнее.

Ranyar пишет:

Для удаления можно составить аналогично.

не нужно. удалять умеет сама find, без костыля xargs.

Fat-Zer пишет:

не говоря уже о том, что вообще не заработает.... скажет, что мол слишком много аргументов...

ну сначала повесит намертво сервак, а потом скажет  :o
если OOM Killer не грохнет раньше  :O

+ открыть спойлер

а вообще, свои "советы" проверять надо.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

8

drBatty, я свой метод проверил, каталоги не удаляются.

 Консоль:

mihail@ProToshiba:~$ mkdir test
mihail@ProToshiba:~$ cd test
mihail@ProToshiba:~/test$ mkdir 1 2 3
mihail@ProToshiba:~/test$ touch 1/1 1/2 1/3
mihail@ProToshiba:~/test$ touch 2/1 2/2 2/3
mihail@ProToshiba:~/test$ touch 3/1 3/2 3/3
mihail@ProToshiba:~/test$ ls
1  2  3
mihail@ProToshiba:~/test$ ls 1 && ls 2 && ls 3
1  2  3
1  2  3
1  2  3
mihail@ProToshiba:~/test$ rm */*
mihail@ProToshiba:~/test$ ls
1  2  3
mihail@ProToshiba:~/test$ ls 1 && ls 2 && ls 3

iMac 21.5, Asus U36JC, iPad 2, iPhone 4S

9

zvezdochots пишет:

я свой метод проверил, каталоги не удаляются.

zvezdochots пишет:

$ rm */*

zvezdochots пишет:

rm */*/*

э...
почти никакой разницы...

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

10

подобная задача была на одном из собеседований в yandex. Был еще вопрос в тему find : как можно посмотреть листинг каталога без помощи ls )

— Ты кто?
— Часть силы той, что без числа
Творит добро, всему желая зла. © Фауст

11

riso пишет:

подобная задача была на одном из собеседований в yandex.

не знаю как там на собеседовании (думаю также), но в продакшене такое сплошь и рядом. Когда какой-то криворукий идиот забыл сделать очистку, и ВНЕЗАПНО кончились inodes. ac
find самое быстрое. Но удалить миллионы файлов - это вам не фунт изюму.
Звёздочка ещё дольше, если конечно она вообще сработает (что не факт).

riso пишет:

Был еще вопрос в тему find : как можно посмотреть листинг каталога без помощи ls )

как вам:

 Консоль:
$ echo *

?
Казалось-бы, причём тут find? bx

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

12 (30.08.2011 16:48:43 отредактировано aka)

Удалилось ~110Гб, количество файлов 1723843, сервер был в продакшне, проблем не возникло кроме небольшого LA, что логично. Длилось около 1часа 20 минут, но думаю ,если бы не писал в файл и не продакт, то было бы быстрее.

Выглядело так:

 Консоль:
find /mnt/dataf/ -mtime +183 -type f -delete -print 2>&1 >> /data/files_delete.report2

Спасибо всем большое! ab

13

Казалось-бы, причём тут find?

find . -print был ответ, правда листинг будет рекурсивный. echo * конечно тоже можно.

— Ты кто?
— Часть силы той, что без числа
Творит добро, всему желая зла. © Фауст

14

эм, dir и dir -l еще:)

15

riso пишет:

find . -print был ответ

-print это поведение по умолчанию. можно просто find.

riso пишет:

правда листинг будет рекурсивный.

find -maxdepth 1
если хочется 1й уровень.

aka пишет:

эм, dir и dir -l еще:)

dir это alias для ls.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

16

за find -maxdepth 1 спасибо. Ман читать лень же.

— Ты кто?
— Часть силы той, что без числа
Творит добро, всему желая зла. © Фауст