Вы не вошли.
Страницы 1


Есть рейд на 10TB. 6TB уже занято. Всего как-бы не соврать... по-моему более 10 млн. файлов. В основном картинки.
Задача найти приложение, которое бы позволяло удалять все файлы, за исключением содержимого каталога "project" т.е. поддерживала фильтры.
Проблема в том, что на скриптах это дело сделать не получается. Рейд медленный и находится на сетевом устройстве, которое иногда лагает и система несколько раз в сутки на несколько секунд теряет с ним коннект.
Я написал скрипт на PowerShell, тот работает ниебически долго читая все эти миллионы файлов и их аттрибуты, и часов через 6-8 выпадает по указанной причине. Вроде бы ничего не успев удалить. Хотя точно не знаю.
Не знаю как бы тут линуксовые инструменты отработали т.к. не уверен, что они бы нормально подобные железячные косяки могли обработать.
Задача найти способ удалить все файлы созданные, скажем, пол года назад, акромя файлов в указанном каталоге...
Вне форума


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


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


Скорее всего отваливается из-за переисбытка памяти. В PowerShell можно избавляться от богонеугодных обьектов так:
$FileContent = Get-Content Большой-Файл.тхт
# бла бла бла х*й пизда поработали с текстом в файле
$FileContent = $null
[System.GC]::Collect()Тут надо будет заново реализовать коммандлет для поиска файлов по частям в массив, а не все сразу. К примеру: взять 1000 файлов и прикончить их, потом следующие 1000. При этом хорошенько чистить память.
Не знаю как бы тут линуксовые инструменты отработали т.к. не уверен, что они бы нормально подобные железячные косяки могли обработать.
Я вижу два варианта:
1. Линуховые утилиты отвалятся в out of memory, из-за своей негибкости, которая бы не позволила реализовать сложный алгоритм.
2. Линуховые утилиты сработают быстрее и стабильнее, т.к. работают просто с текстом и им не надо гемороится с растратой памяти виртуальной машины.
Добавлено спустя 07 мин 36 с:
Если предложишь красивый вариант, желательно в коде, то в понедельник смогу попробовать
Тут понимаешь, за двадцать минут все на шкриптиках забацать не получится. Придется включить мозги. Интересная задача. Хочется посмотреть варианты решения на питоне и баше.
Удовлетворен GNU/Linux (с) Linups_Troolvalds
13-значный пароль, состоящий из одних цифр, ломается за полчаса (с) Rector. Авторитетный Хакер у себя в классе
Я тебя просто отсюда выпилю. (с) Рехтур. Взламывает анусы по ойпи.
Вне форума


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


Задача найти приложение, которое бы позволяло удалять все файлы, за исключением содержимого каталога "project" т.е. поддерживала фильтры.
find ДИРЕКТОРИЯ -type d -not -name "*XXX*" -deleteзадаём -type d, и find вообще не ищет по файлам, только по директориям и удаляет их вместе с содержимым через -delete.
Отредактировано terminaLtor (02-09-12 01:36:29)
Вне форума


terminaLtor, как я ждал тупого линохода, не вникшего в проблему, но с find'ом 
Вникай сюда:
лагает и система несколько раз в сутки на несколько секунд теряет с ним коннект
ниебически долго читая все эти миллионы файлов и их аттрибуты
Твой find повторит судьбу PowerShell. Он отвалится через несколько часов и все.
Отредактировано Babusha (02-09-12 00:44:29)
Удовлетворен GNU/Linux (с) Linups_Troolvalds
13-значный пароль, состоящий из одних цифр, ломается за полчаса (с) Rector. Авторитетный Хакер у себя в классе
Я тебя просто отсюда выпилю. (с) Рехтур. Взламывает анусы по ойпи.
Вне форума


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)
Анархия-мама сынов своих любит
Вне форума


/ меланхолично / А я бы пингом по портам на сишарпе заебашил бы. Один раз как-то понадобилось прочесать кучу файлов и переименовать по определенном алгоритму, именно так я и сделал. Уж больно повершелл не хотелось учить, чота он мне никак не дается.
Добавлено спустя 12 мин 02 с:
Лука, а там вложенность каталогов глубокая?
Добавлено спустя 29 мин 11 с:
Задача найти способ удалить все файлы созданные, скажем, пол года назад, акромя файлов в указанном каталоге...
Не понял все же задачу - а почему нельзя сразу удалять файлы попадающие под условие и периодически помечать, скажем, в локальном текстовом файле, где был в последний раз, а после рестарта начинать с этого места?
Ну на мой взгляд засорение происходит от установки/удаления програм, использования програм, и просто самих ошибок в по.На опере когдато(не понмю точно) был глюк когда она с каждым днём жрала памятивсё больше.здесь принцип очень похож.используя какой либо софт в виндовсе он портится.у меня реально рекорд 1.5 года на ХР без переустановки. © OpenMind
Вне форума


Задача найти способ удалить все файлы созданные, скажем, пол года назад, акромя файлов в указанном каталоге...
не надо косить под линукс-Ыспециалиста.
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 часов после чего я получил ошибку доступа -- видимо была короткая потеря связи и все оборвалось.
Вне форума


Я не понимаю что происходит. Я запускаю скрипт на PowerShell, который вроде бы должен читать все файлы в массив
Все 10 миллионов? Это, я бы сказал, не слишком разумная идея. Найдите каталоги, и пробегаетесь по ним тем же повершеллом. ка я и предлагал.
Анархия-мама сынов своих любит
Вне форума


Как тут время создания файла задается? Приведи пример как задать дату "старше чем пол года".
Вроде никак. Тогда фильтровать файлы надо не самим find'ом, а вручную через if.
. все использованные утилиты сугубо под nix
да ты что?
Я не понимаю что происходит. Я запускаю скрипт на PowerShell, который вроде бы должен читать все файлы в массив и далее foreach'ем пробегать по ним и удалять все, дата которых значится как "более полугода назад".
А надо, чтобы сразу на лету, как только нашелся файл его проверять и если что - удалять. Без промежуточного массива.
Однако скрипт начинает очень долго думать. Уходят долгие часы. В прошлый раз прошло около 6 часов после чего я получил ошибку доступа -- видимо была короткая потеря связи и все оборвалось.
А так на лету можно будет добавить try-catch и при чтении перейдет к следующему файлу.
Все 10 миллионов? Это, я бы сказал, не слишком разумная идея.
Наконец-то умная мысль.
Найдите каталоги, и пробегаетесь по ним тем же повершеллом. ка я и предлагал.
А теперь нет, дурацкая мысль.
find / -type d > list
И что? Это равносильно Get-ChildItem ./ -Recurse -Attributes Directory> list.txt, только зачем?
cat list
Еще большиц пиздец, зачем?
Надо придумать, как сделать все это без промежуточного массива, в который пихать миллионы имен файлов. А для этого надо чтобы как только считался файл, сразу с ним поработать.
Удовлетворен GNU/Linux (с) Linups_Troolvalds
13-значный пароль, состоящий из одних цифр, ломается за полчаса (с) Rector. Авторитетный Хакер у себя в классе
Я тебя просто отсюда выпилю. (с) Рехтур. Взламывает анусы по ойпи.
Вне форума


Вроде никак. Тогда фильтровать файлы надо не самим find'ом, а вручную через if.
Прочитайте уже мануал по find.
Надо придумать, как сделать все это без промежуточного массива, в который пихать миллионы имен файлов. А для этого надо чтобы как только считался файл, сразу с ним поработать.
find так и делает. Только как вы будете возобновлять работу, когда оно отвалится? Я вам еще раз говорю readdir(3) возвращает элементы каталога в произвольном порядке, без сортировки.
Только искать надо не все каталоги, а оконечные.
Анархия-мама сынов своих любит
Вне форума


Как тут время создания файла задается? Приведи пример как задать дату "старше чем пол года".
find /dir -mtime +185 -print185 - кол-во дней
Вне форума


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


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


Можно как-то так
$ $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̶`́`:.
Вне форума
Страницы 1
[ Сгенерировано за 0.012 сек, 7 запросов выполнено - Использовано памяти: 1.76 Мбайт (Пик: 1.84 Мбайт) ]