Страницы 1
Есть рейд на 10TB. 6TB уже занято. Всего как-бы не соврать... по-моему более 10 млн. файлов. В основном картинки.
Задача найти приложение, которое бы позволяло удалять все файлы, за исключением содержимого каталога "project" т.е. поддерживала фильтры.
Проблема в том, что на скриптах это дело сделать не получается. Рейд медленный и находится на сетевом устройстве, которое иногда лагает и система несколько раз в сутки на несколько секунд теряет с ним коннект.
Я написал скрипт на PowerShell, тот работает ниебически долго читая все эти миллионы файлов и их аттрибуты, и часов через 6-8 выпадает по указанной причине. Вроде бы ничего не успев удалить. Хотя точно не знаю.
Не знаю как бы тут линуксовые инструменты отработали т.к. не уверен, что они бы нормально подобные железячные косяки могли обработать.
Задача найти способ удалить все файлы созданные, скажем, пол года назад, акромя файлов в указанном каталоге...
Неактивен
Выложи скрипт. Можно сделать так: не индексировать все файлы сразу, а по частям, после чего чистить их по дате. Потом создать новый массив с другой частью файлов, и посмотреть так, чтобы ничего не ссылалось на прошлый массив и сборщик мусора сам приберет это говно.
Неактивен
Babusha, скрипт выложить не могу т.к. он остался на работе, но было что-то короткое.
Если предложишь красивый вариант, желательно в коде, то в понедельник смогу попробовать. В каталоге может быть много подкаталогов и в каждом из них около 1000 - 10000 файлов.
Неактивен
Скорее всего отваливается из-за переисбытка памяти. В PowerShell можно избавляться от богонеугодных обьектов так:
$FileContent = Get-Content Большой-Файл.тхт
# бла бла бла х*й пизда поработали с текстом в файле
$FileContent = $null
[System.GC]::Collect()
Тут надо будет заново реализовать коммандлет для поиска файлов по частям в массив, а не все сразу. К примеру: взять 1000 файлов и прикончить их, потом следующие 1000. При этом хорошенько чистить память.
Не знаю как бы тут линуксовые инструменты отработали т.к. не уверен, что они бы нормально подобные железячные косяки могли обработать.
Я вижу два варианта:
1. Линуховые утилиты отвалятся в out of memory, из-за своей негибкости, которая бы не позволила реализовать сложный алгоритм.
2. Линуховые утилиты сработают быстрее и стабильнее, т.к. работают просто с текстом и им не надо гемороится с растратой памяти виртуальной машины.
Добавлено спустя 07 мин 36 с:
Если предложишь красивый вариант, желательно в коде, то в понедельник смогу попробовать
Тут понимаешь, за двадцать минут все на шкриптиках забацать не получится. Придется включить мозги. Интересная задача. Хочется посмотреть варианты решения на питоне и баше.
Неактивен
Babusha, да кстати, вариант на питоне и баше был бы интересен.
По поводу того, что может вылетать по out-if-memory, возможно ты и прав, однако очевидно имеет место и железячный глюк т.к. есть кое-какие другие приколы. Типа система иногда этот хард теряет. Логика потерь не понятна.
Просто проблема в том, что я не могу тестить все подряд реализации т.к. учитывая объем данных на это могут уйти сутки на каждый тест нового кода. Поэтому нужно какое-то решение, которое сходу будет близко к максимально оптимальному.
Неактивен
Задача найти приложение, которое бы позволяло удалять все файлы, за исключением содержимого каталога "project" т.е. поддерживала фильтры.
find ДИРЕКТОРИЯ -type d -not -name "*XXX*" -delete
задаём -type d, и find вообще не ищет по файлам, только по директориям и удаляет их вместе с содержимым через -delete.
Редактировался terminaLtor (02-09-12 02:36:29)
Неактивен
terminaLtor, как я ждал тупого линохода, не вникшего в проблему, но с find'ом
Вникай сюда:
лагает и система несколько раз в сутки на несколько секунд теряет с ним коннект
ниебически долго читая все эти миллионы файлов и их аттрибуты
Твой find повторит судьбу PowerShell. Он отвалится через несколько часов и все.
Редактировался Babusha (02-09-12 01:44:29)
Неактивен
Задача найти способ удалить все файлы созданные, скажем, пол года назад, акромя файлов в указанном каталоге...
не надо косить под линукс-Ыспециалиста.
robocopy "source path" "\Device\Null" /E /MOV /MINAGE:150 /XD "path exclude dir"
про логи и обрыв соединения см. справку по робокопи
лИнус прикажет - дураки найдутся
Неактивен
задаём -type d, и find вообще не ищет по файлам, только по директориям и удаляет их вместе с содержимым через -delete.
Как тут время создания файла задается? Приведи пример как задать дату "старше чем пол года".
petrun, к сожалению тут не иначе как Linux целиком нужно будет ставить т.к. все использованные утилиты сугубо под nix, поэтому проверить вряд ли получится. Вот в рамках отдельных портов это еще можно было бы...
Уж больно повершелл не хотелось учить, чота он мне никак не дается.
Он очень прост для таких задач... На нем код реально в 3-4 раза более короткий и более читабельный получается...
Лука, а там вложенность каталогов глубокая?
до 7 уровней, если считать от корня диска.
Не понял все же задачу - а почему нельзя сразу удалять файлы попадающие под условие и периодически помечать, скажем, в локальном текстовом файле, где был в последний раз, а после рестарта начинать с этого места?
Я не понимаю что происходит. Я запускаю скрипт на PowerShell, который вроде бы должен читать все файлы в массив и далее foreach'ем пробегать по ним и удалять все, дата которых значится как "более полугода назад".
Однако скрипт начинает очень долго думать. Уходят долгие часы. В прошлый раз прошло около 6 часов после чего я получил ошибку доступа -- видимо была короткая потеря связи и все оборвалось.
Неактивен
Как тут время создания файла задается? Приведи пример как задать дату "старше чем пол года".
Вроде никак. Тогда фильтровать файлы надо не самим find'ом, а вручную через if.
. все использованные утилиты сугубо под nix
да ты что?
Я не понимаю что происходит. Я запускаю скрипт на PowerShell, который вроде бы должен читать все файлы в массив и далее foreach'ем пробегать по ним и удалять все, дата которых значится как "более полугода назад".
А надо, чтобы сразу на лету, как только нашелся файл его проверять и если что - удалять. Без промежуточного массива.
Однако скрипт начинает очень долго думать. Уходят долгие часы. В прошлый раз прошло около 6 часов после чего я получил ошибку доступа -- видимо была короткая потеря связи и все оборвалось.
А так на лету можно будет добавить try-catch и при чтении перейдет к следующему файлу.
Все 10 миллионов? Это, я бы сказал, не слишком разумная идея.
Наконец-то умная мысль.
Найдите каталоги, и пробегаетесь по ним тем же повершеллом. ка я и предлагал.
А теперь нет, дурацкая мысль.
find / -type d > list
И что? Это равносильно Get-ChildItem ./ -Recurse -Attributes Directory> list.txt, только зачем?
cat list
Еще большиц пиздец, зачем?
Надо придумать, как сделать все это без промежуточного массива, в который пихать миллионы имен файлов. А для этого надо чтобы как только считался файл, сразу с ним поработать.
Неактивен
Как тут время создания файла задается? Приведи пример как задать дату "старше чем пол года".
find /dir -mtime +185 -print
185 - кол-во дней
Неактивен
А надо, чтобы сразу на лету, как только нашелся файл его проверять и если что - удалять. Без промежуточного массива.
Предложи вариант в коде...
Про mingw.org знаю, только не уверен в стабильности неродного решения.
Неактивен
Я еще со вчера думаю над этим.
Да стабильно файнд работает на винде. Если он сначала делает список всех файлов, оно тебе не поможет.
Неактивен
Страницы 1