Объявление

Односложные и бессмысленные темы, не несущие полезную нагрузку или не содержащие в себе вопрос, будут удаляться!

#1 01-09-12 22:45:02

Luca
Участник
Здесь с 03-09-09
Сообщений: 1,545
Windows 7Firefox 15.0

Как удалить старые файлы?

Есть рейд на 10TB. 6TB уже занято. Всего как-бы не соврать... по-моему более 10 млн. файлов. В основном картинки.

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

Проблема в том, что на скриптах это дело сделать не получается. Рейд медленный и находится на сетевом устройстве, которое иногда лагает и система несколько раз в сутки на несколько секунд теряет с ним коннект.

Я написал скрипт на PowerShell, тот работает ниебически долго читая все эти миллионы файлов и их аттрибуты, и часов через 6-8 выпадает по указанной причине. Вроде бы ничего не успев удалить. Хотя точно не знаю.

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

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

Вне форума

#2 01-09-12 22:55:13

Babusha
Нехристь
Здесь с 12-03-10
Сообщений: 2,221
Windows 8Chrome 21.0

Re: Как удалить старые файлы?

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


Удовлетворен GNU/Linux (с) Linups_Troolvalds
13-значный пароль, состоящий из одних цифр, ломается за полчаса (с) Rector. Авторитетный Хакер у себя в классе
Я тебя просто отсюда выпилю.  (с) Рехтур. Взламывает анусы по ойпи.

Вне форума

#3 01-09-12 23:27:35

Luca
Участник
Здесь с 03-09-09
Сообщений: 1,545
Windows 7Firefox 15.0

Re: Как удалить старые файлы?

Babusha, скрипт выложить не могу т.к. он остался на работе, но было что-то короткое.

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

Вне форума

#4 01-09-12 23:27:51

Babusha
Нехристь
Здесь с 12-03-10
Сообщений: 2,221
Windows 8Chrome 21.0

Re: Как удалить старые файлы?

Скорее всего отваливается из-за переисбытка памяти. В PowerShell можно избавляться от богонеугодных обьектов так:

$FileContent = Get-Content Большой-Файл.тхт
# бла бла бла х*й пизда поработали с текстом в файле
$FileContent = $null 
[System.GC]::Collect()

Тут надо будет заново реализовать коммандлет для поиска файлов по частям в массив, а не все сразу. К примеру: взять 1000 файлов и прикончить их, потом следующие 1000. При этом хорошенько чистить память.

Luca пишет:

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

Я вижу два варианта:
1. Линуховые утилиты отвалятся в out of memory, из-за своей негибкости, которая бы не позволила реализовать сложный алгоритм.
2. Линуховые утилиты сработают быстрее и стабильнее, т.к. работают просто с текстом и им не надо гемороится с растратой памяти виртуальной машины.

Добавлено спустя 07 мин 36 с:

Luca пишет:

Если предложишь красивый вариант, желательно в коде, то в понедельник смогу попробовать

Тут понимаешь, за двадцать минут все на шкриптиках забацать не получится. Придется включить мозги. Интересная задача. Хочется посмотреть варианты решения на питоне и баше.


Удовлетворен GNU/Linux (с) Linups_Troolvalds
13-значный пароль, состоящий из одних цифр, ломается за полчаса (с) Rector. Авторитетный Хакер у себя в классе
Я тебя просто отсюда выпилю.  (с) Рехтур. Взламывает анусы по ойпи.

Вне форума

#5 01-09-12 23:41:19

Luca
Участник
Здесь с 03-09-09
Сообщений: 1,545
Windows 7Firefox 15.0

Re: Как удалить старые файлы?

Babusha, да кстати, вариант на питоне и баше был бы интересен.

По поводу того, что может вылетать по out-if-memory, возможно ты и прав, однако очевидно имеет место и железячный глюк т.к. есть кое-какие другие приколы. Типа система иногда этот хард теряет. Логика потерь не понятна.

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

Вне форума

#6 02-09-12 00:34:24

terminaLtor
Powered by GNU/Linux
Откуда: Интернета
Здесь с 05-07-10
Сообщений: 1,438
UbuntuChromium 18.0

Re: Как удалить старые файлы?

Luca пишет:

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

find ДИРЕКТОРИЯ -type d -not -name "*XXX*" -delete

задаём -type d, и find вообще не ищет по файлам, только по директориям и удаляет их вместе с содержимым через -delete.

Отредактировано terminaLtor (02-09-12 01:36:29)

Вне форума

#7 02-09-12 00:43:13

Babusha
Нехристь
Здесь с 12-03-10
Сообщений: 2,221
Windows 8Chrome 21.0

Re: Как удалить старые файлы?

terminaLtor, как я ждал тупого линохода, не вникшего в проблему, но с find'ом big_smile

Вникай сюда:

Luca пишет:

лагает и система несколько раз в сутки на несколько секунд теряет с ним коннект

Luca пишет:

ниебически долго читая все эти миллионы файлов и их аттрибуты

Твой find повторит судьбу PowerShell. Он отвалится через несколько часов и все.

Отредактировано Babusha (02-09-12 00:44:29)


Удовлетворен GNU/Linux (с) Linups_Troolvalds
13-значный пароль, состоящий из одних цифр, ломается за полчаса (с) Rector. Авторитетный Хакер у себя в классе
Я тебя просто отсюда выпилю.  (с) Рехтур. Взламывает анусы по ойпи.

Вне форума

#8 02-09-12 01:20:11

petrun
Участник
Здесь с 22-10-09
Сообщений: 3,172
LinuxFirefox 14.0

Re: Как удалить старые файлы?

find / -type d > list
cat list | while read dir;do find ${dir} ! -name "*XXX*" -delete;do
Те каталоги, на которых второй find сфейлится опадут в stderr, их можно в другой список накатать, или ручками сделать.
Это если не думать.

Если подумать, то сильно оптимизировать и не выйдет, так как readdir(3) возвращает значения в любом ей удобном порядке.

Отредактировано petrun (02-09-12 01:36:22)


Анархия-мама сынов своих любит

Вне форума

#9 02-09-12 02:51:20

Бродяга
Весёлый тролль
Здесь с 08-10-09
Сообщений: 911
Windows 7Firefox 15.0

Re: Как удалить старые файлы?

/ меланхолично / А я бы пингом по портам на сишарпе заебашил бы. Один раз как-то понадобилось прочесать кучу файлов и переименовать по определенном алгоритму, именно так я и сделал. Уж больно повершелл не хотелось учить, чота он мне никак не дается.

Добавлено спустя 12 мин 02 с:
Лука, а там вложенность каталогов глубокая?

Добавлено спустя 29 мин 11 с:

Luca пишет:

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

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


Ну на мой взгляд засорение происходит от установки/удаления програм, использования програм, и просто самих ошибок в по.На опере когдато(не понмю точно) был глюк когда она с каждым днём жрала памятивсё больше.здесь принцип очень похож.используя какой либо софт в виндовсе он портится.у меня реально рекорд 1.5 года на ХР без переустановки. © OpenMind

Вне форума

#10 02-09-12 09:11:35

linupzer
Участник
Здесь с 29-12-10
Сообщений: 95
Windows XPMaxthon 3.0

Re: Как удалить старые файлы?

Luca пишет:

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

не надо косить под линукс-Ыспециалиста.

robocopy "source path" "\Device\Null" /E  /MOV /MINAGE:150 /XD "path exclude dir"

про логи и обрыв соединения см. справку по робокопи


лИнус прикажет - дураки найдутся

Вне форума

#11 02-09-12 12:04:49

Luca
Участник
Здесь с 03-09-09
Сообщений: 1,545
Windows 7Firefox 15.0

Re: Как удалить старые файлы?

terminaLtor пишет:

задаём -type d, и find вообще не ищет по файлам, только по директориям и удаляет их вместе с содержимым через -delete.

Как тут время создания файла задается? Приведи пример как задать дату "старше чем пол года".

petrun, к сожалению тут не иначе как Linux целиком нужно будет ставить т.к. все использованные утилиты сугубо под nix, поэтому проверить вряд ли получится. Вот в рамках отдельных портов это еще можно было бы...

Бродяга пишет:

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

Он очень прост для таких задач... На нем код реально в 3-4 раза более короткий и более читабельный получается...

Бродяга пишет:

Лука, а там вложенность каталогов глубокая?

до 7 уровней, если считать от корня диска.

Бродяга пишет:

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

Я не понимаю что происходит. Я запускаю скрипт на PowerShell, который вроде бы должен читать все файлы в массив и далее foreach'ем пробегать по ним и удалять все, дата которых значится как "более полугода назад".

Однако скрипт начинает очень долго думать. Уходят долгие часы. В прошлый раз прошло около 6 часов после чего я получил ошибку доступа -- видимо была короткая потеря связи и все оборвалось.

Вне форума

#12 02-09-12 12:20:34

petrun
Участник
Здесь с 22-10-09
Сообщений: 3,172
LinuxFirefox 14.0

Re: Как удалить старые файлы?

Luca пишет:

Я не понимаю что происходит. Я запускаю скрипт на PowerShell, который вроде бы должен читать все файлы в массив

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


Анархия-мама сынов своих любит

Вне форума

#13 02-09-12 13:12:07

Babusha
Нехристь
Здесь с 12-03-10
Сообщений: 2,221
Windows 8Chrome 21.0

Re: Как удалить старые файлы?

petrun пишет:

Как тут время создания файла задается? Приведи пример как задать дату "старше чем пол года".

Вроде никак. Тогда фильтровать файлы надо не самим find'ом, а вручную через if.

Luca пишет:

. все использованные утилиты сугубо под nix

да ты что?

www.mingw.org/

Luca пишет:

Я не понимаю что происходит. Я запускаю скрипт на PowerShell, который вроде бы должен читать все файлы в массив и далее foreach'ем пробегать по ним и удалять все, дата которых значится как "более полугода назад".

А надо, чтобы сразу на лету, как только нашелся файл его проверять и если что - удалять. Без промежуточного массива.

Luca пишет:

Однако скрипт начинает очень долго думать. Уходят долгие часы. В прошлый раз прошло около 6 часов после чего я получил ошибку доступа -- видимо была короткая потеря связи и все оборвалось.

А так на лету можно будет добавить try-catch и при чтении перейдет к следующему файлу.

petrun пишет:

Все 10 миллионов? Это, я бы сказал, не слишком разумная идея.

Наконец-то умная мысль.

petrun пишет:

Найдите каталоги, и пробегаетесь по ним тем же повершеллом. ка я и предлагал.

А теперь нет, дурацкая мысль.

petrun пишет:

find / -type d > list

И что? Это равносильно Get-ChildItem ./ -Recurse -Attributes Directory> list.txt, только зачем?

petrun пишет:

cat list

Еще большиц пиздец, зачем?

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


Удовлетворен GNU/Linux (с) Linups_Troolvalds
13-значный пароль, состоящий из одних цифр, ломается за полчаса (с) Rector. Авторитетный Хакер у себя в классе
Я тебя просто отсюда выпилю.  (с) Рехтур. Взламывает анусы по ойпи.

Вне форума

#14 02-09-12 13:48:48

petrun
Участник
Здесь с 22-10-09
Сообщений: 3,172
LinuxFirefox 14.0

Re: Как удалить старые файлы?

Babusha пишет:

Вроде никак. Тогда фильтровать файлы надо не самим find'ом, а вручную через if.

Прочитайте уже мануал по find.

Babusha пишет:

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

find так и делает. Только как вы будете возобновлять работу, когда оно отвалится? Я вам еще раз говорю readdir(3) возвращает элементы каталога в произвольном порядке, без сортировки.
Только искать надо не все каталоги, а оконечные.


Анархия-мама сынов своих любит

Вне форума

#15 02-09-12 16:43:00

terminaLtor
Powered by GNU/Linux
Откуда: Интернета
Здесь с 05-07-10
Сообщений: 1,438
UbuntuChromium 18.0

Re: Как удалить старые файлы?

Luca пишет:

Как тут время создания файла задается? Приведи пример как задать дату "старше чем пол года".

find /dir -mtime +185 -print

185 - кол-во дней

Вне форума

#16 02-09-12 17:11:49

Luca
Участник
Здесь с 03-09-09
Сообщений: 1,545
Windows 7Firefox 15.0

Re: Как удалить старые файлы?

petrun пишет:

А надо, чтобы сразу на лету, как только нашелся файл его проверять и если что - удалять. Без промежуточного массива.

Предложи вариант в коде...

Про mingw.org знаю, только не уверен в стабильности неродного решения.

Вне форума

#17 02-09-12 19:11:05

Babusha
Нехристь
Здесь с 12-03-10
Сообщений: 2,221
MacintoshSafari 5.0

Re: Как удалить старые файлы?

Я еще со вчера думаю над этим.

Да стабильно файнд работает на винде. Если он сначала делает список всех файлов, оно тебе не поможет.


Удовлетворен GNU/Linux (с) Linups_Troolvalds
13-значный пароль, состоящий из одних цифр, ломается за полчаса (с) Rector. Авторитетный Хакер у себя в классе
Я тебя просто отсюда выпилю.  (с) Рехтур. Взламывает анусы по ойпи.

Вне форума

#18 02-09-12 19:26:56

Linups_Troolvalds
С нами Баг!
Откуда: Отовсюду
Здесь с 06-10-09
Сообщений: 2,100
LinuxChrome 22.0

Re: Как удалить старые файлы?

Можно как-то так

$ $EDITOR find+

#!/bin/sh

work_path=.
if [ "$1" != "" ] 
then
    work_path=$1
else
    echo `basename $0` "<path/to/files>"
    exit 1
fi

age=185
try_cnt=100
target_name="$@"
fail_delay=5

if [ $0 = "./find+" ]
then
    find . -maxdepth 15 -type d -regex ".*project.*" -prune -o -execdir \
    find '{}' \; -type f -mtime +$age -exec ./rm+ '{}' \;
else
    for (( i=0;$i<$try_cnt;i++ ))
    do
        echo "$target_name (try $i )" 
        rm -f "$target_name" && break
        sleep $fail_delay
    done
fi

$ chmod +x find+; ln -s find+ rm+
$ ./find+ path/to/raid/

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

Отредактировано Linups_Troolvalds (02-09-12 19:28:16)


.:``́3̶E̶P̶O̶W̶h̶`́`:.

Вне форума

Сейчас в этой теме пользователей: 0, гостей: 1
[Bot] ClaudeBot

Подвал форума

Под управлением FluxBB
Модифицировал Visman

[ Сгенерировано за 0.012 сек, 7 запросов выполнено - Использовано памяти: 1.76 Мбайт (Пик: 1.84 Мбайт) ]