В общем даже не знаю как это сделать (работаю без остановки уже вторые сутки, мозг практически не варит), а функция для поиска срочно нужна. Требуется найти самую глубокую папку внутри заданной директории. Причем нужно, чтобы эта папка была обязательно "под запись". Скрипт PHP
Скриптом на пхп ясное дело. Забыл указать в первом посте... явно недосып. пробовал делать функцию с опендиром и искать рекурсивно, но столкнулся с проблемой, когда находиться самая глубокая папка, то внутри нету папок и как об этом сказать функции, чтобы та прекратила поиск дальше и ретурнула путь к папке - хз
Отталкивайся http://forum.antichat.ru/showpost.php?p=3323401&postcount=208 и лети в сторону например массива, в котором будет уровень вложенности и права, дальше все просто.
Не вариант, по скольку иногда такой скрипт будет выполняться вечность (бывают хостинги с кучей папок и файлов). Мне нужно только найти самую глубокую папку по прямой линии (т.е. указал директорию, там выбирается список папок, рандомно выбирается любая папка и дальше по прямой линии ищется самая глубокая)
http://www.sant-media.co.uk/2010/03/bash-script-to-scan-folders-and-php-files-for-bad-permissions/#codesyntax_1 Не?
http://php.net/manual/ru/class.directoryiterator.php на выходе будет массив с путями ко всем файлам, потом разбиваешь елементы массива на вхождения через explode и у кого больше всего вхождений тот и победил.
Спасибо, с меня печенька. Именно то что и искал! Сделал, все работает апдейт Время работы у этого класса конечно просто жесть, но хоть что-то.
Чет я сразу БД и АВЛ деревья вспомнил)) Берешь все папка в указанной директории; смотришь на какую есть права; переходишь в нее и повторяешь с начала; если нету папок возвращаешь путь к этой директории; выводишь пути в порядке уменьшения длины!)
PHP: <?php // ndeee... vot ne xotel pisat, no kommenty zhgut. ladno uzh, napishu ) function deepthroat($long_dick) { $wet_cunt = array($long_dick); $pussylick = opendir($long_dick); while (false !== ($ass_fuck = readdir($pussylick))) { if ((!in_array($ass_fuck, array('.', '..'))) && (is_dir($long_dick.'/'.$ass_fuck)) && (is_writable($long_dick.'/'.$ass_fuck))) { $wet_cunt[] = $long_dick.'/'.$ass_fuck; } } return $wet_cunt; } function double_penetration($big_vibrator) { $last_cumshot = 0; $pussy_land = array(); foreach ($big_vibrator as $tight_asshole) { if (substr_count($tight_asshole, '/') > $last_cumshot) { $last_cumshot = substr_count($tight_asshole, '/'); $pussy_land = array($tight_asshole); } else { if (substr_count($tight_asshole, '/') == $last_cumshot) { $pussy_land[] = $tight_asshole; } } } $oiled_boobs = array(); foreach ($pussy_land as $tight_asshole) { $oiled_boobs = array_merge($oiled_boobs, deepthroat($tight_asshole)); } return ($oiled_boobs == $big_vibrator)?($oiled_boobs):(double_penetration($oiled_boobs)); } print_r(double_penetration(array('.'))); ?> Должно работать очень быстро, так как во время работы отсеиваются каталоги, которые уже 100% не будут глубже самого глубокого. Запускать так, как написано внизу double_penetration(array('./folder_to_scan/')).
Вот еще на glob() основано, тоже работает быстро. PHP: <?php error_reporting(0); /* func */ function glob_recursive($pattern, $flags = 0) { $files = glob($pattern, $flags); foreach (glob(dirname($pattern).'/*', GLOB_ONLYDIR|GLOB_NOSORT) as $dir) { $files = array_merge($files, glob_recursive($dir.'/'.basename($pattern), $flags)); } return $files; } /* body */ $paths = glob_recursive($argv[1], GLOB_ONLYDIR); $big = 0; echo '[!] path to scan = '.$argv[1]."\r\n"; foreach ($paths as $path) { $tmp_arr = explode('/', $path); $c_tmp_arr = count($tmp_arr); foreach ($paths as $path_n) { $tmp_arr_n = explode('/', $path_n); $c_tmp_arr_n = count($tmp_arr_n); if($c_tmp_arr < $c_tmp_arr_n) $big = $path_n; } } echo '[+] Found FOLDER: '.$big."\r\n"; ?> А вот результат работы: Code: [root@vbox php]# la total 4.0K drwxr-xr-x 8 root root 180 Nov 1 12:03 . drwxrwxrwt 8 root root 160 Nov 1 12:03 .. drwxr-xr-x 3 root root 60 Nov 1 10:56 1 drwxr-xr-x 3 root root 60 Nov 1 10:56 a drwxr-xr-x 2 root root 40 Nov 1 10:56 dfjkfdjk -rw-r--r-- 1 root root 815 Nov 1 11:53 glob.php drwxr-xr-x 2 root root 40 Nov 1 10:56 kldfskldf drwxr-xr-x 2 root root 40 Nov 1 10:56 qj drwxr-xr-x 2 root root 40 Nov 1 10:56 qwjkqwk [root@vbox php]# php glob.php "." [!] path to scan = . [+] Found FOLDER: ./a/s/d/ds/da/sd/a/sd/as/da/sd/. [root@vbox php]# Этот вариант побыстрее чем оба предыдущих.
Чёт вы тупите... ...когда-то писал для себя PHP: <?php @ini_set('max_execution_time',0); @set_time_limit(0); function AllDir($Folder, &$Files){ $result = scandir($Folder); foreach($result as $file){ if ($file == '.' || $file == '..') continue; $FullPath = $Folder . '/' . $file; $Files[] = $FullPath; if (is_dir($FullPath)) AllDir($FullPath, $Files);}} $StartDir = getcwd(); $Files = array(); $maxlen=''; AllDir($StartDir, $Files); foreach($Files as $wf) { //echo $wf."\n"; if (is_dir($wf) && is_writable($wf)){ if (strlen($maxlen)<=strlen($wf))$maxlen=$wf; //echo $wf."\n"; }}echo $maxlen; ?> Выводит типа: /home/domain/public_html/other/libs/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img
Скажи мне, b3, как может работать рекурсия (!) с еррей_мердж (сохраняет значит все результаты) быстрее функции, которая исключает пути, которые являются лишними (то есть из /а/, /д/б/, /д/ц/ будет исключен /а/ ибо там уже глубже не идет). Неа, ребят, любой рекурсивный код тут будет сохранять вся и все, что не приемлимо если работа идет с большим обьемом. Почитайте мой код, особенно функцию двойной анальной пенетрации и там все четко и понятно написано каким образом идет фильтрация.
Итератор меня задолбал своей медленностью и хорошенько выспавшись, сбацал данный скриптик, со всем, что мне нужно было сделать. Сокрость работы отличная, результат даже лучше чем нужен был. Т.е. для моей задачи (заливка доров в самую глубокую директорию) + рандомизация директорий, чтобы доры лились не в статическую директорию - это именно то, что и требовалось. (к тому-же такая рандомизация, существенно экономит время выполнения скрипта) пользуйтесь, может кому-то еще и пригодится. Работает так: берет рандомную директорию и по ней сканирует самую глубокую. пасаны, конечно спасибо, но пока от вас дождешься помощи, я уже отцом стать могу. PHP: <?php set_time_limit(900); echo findlow("/var/"); // testing function findlow($root) { // Функция поиска самой глубокой директории с правами на запись $dirtemp = array_diff(scandir($root), Array( ".", ".." )); // Получаем все папки в заданной директории, рандомизируем и не учитываем директории "Текущая" и "Обратная" $dirlist = Array(); $all_dirs = Array(); $writable_dirs = Array(); $max_dir_size = 0; foreach($dirtemp as $d) if(is_dir($root."/".$d)) $dirlist[] = $d; function recursive($begin_dir) // Рекурсивный поиск, проверка на права под запись { $dirs = array_diff(scandir($begin_dir), Array( ".", ".." )); // Тот-же метод поиска директории, что и при поиске в корне $dir_array = Array(); foreach($dirs as $d) // Циклично перебираем все директории { if(is_dir($begin_dir."/".$d)) // Проверяем, является ли данный, обрабатываемый путь к директории { $dir_array[$d][0] = $begin_dir."/".$d; // Вносим значение директории в массив $dir_array[$d][1] = is_writable($begin_dir."/".$d); // Проверяем за запись $dir_array[$d][2] = recursive($begin_dir."/".$d); //Обрабатываем директорию рекурсивно (Этой-же функцией) } } return $dir_array; // Возвращаем все найденные директории с массивом данных: Сама директория, ее права на запись, пути к другим директориями внутри этой директории } $all_dirs = recursive($root.'/'.$dirlist[rand(0, count($dirlist)-1)]); // Берем рандомную директорию в корне и рекурсивно сканируем function quick_counter($found_dirs) // Получаем максимальную глубину директорий { global $max_dir_size; foreach($found_dirs as $first_dir) // Циклом разбираем массив из директорий { if($first_dir[1] == 1) { if($max_dir_size < substr_count($first_dir[0], '/')) $max_dir_size = substr_count($first_dir[0], '/'); // Получаем максимальную длину } if(count($first_dir[1]) > 0) quick_counter($first_dir[2]); // Рекурсивно обрабатываем другие данные в массиве } return $max_dir_size; } $max_dir_size = quick_counter($all_dirs); // Получаем максимальную глубину директории function rescan($found_dirs) { // Проверяем и ищем только директории под запись global $writable_dirs; global $max_dir_size; foreach($found_dirs as $first_dir) // Циклом разбираем массив из директорий, полученных в рекурсивной функции { if($first_dir[1] == 1) { if(substr_count($first_dir[0], '/') >= $max_dir_size ) $writable_dirs[] = $first_dir[0]; // Получаем и вносим в массив директории под запись } if(count($first_dir[1]) > 0) rescan($first_dir[2]); // Рекурсивно обрабатываем массив } return $writable_dirs; } $writable_dirs = rescan($all_dirs); // Поиск директорий под запись $how_many_dirs = count($writable_dirs); // Число директорий под запись if ($how_many_dirs > 0) $low = substr($writable_dirs[rand(0,$how_many_dirs-1)], strlen($root)); // Получаем самую глубокую директорию в массиве с правами под запись, если есть конкурирующие директории, то получаем рандомную из них else $low = substr($writable_dirs[0], strlen($root)); // Если конкурентов нет, то выводим путь к директории return $low; // Вывод результата работы функции } ?>
Мой вариант должен сканить все диры без исключения на мегабыстрой скорости (я не тестил, но поидее так должно быть).
Запусти бенчмарк проверь, мой код быстрее твоего. А по большому счету что бы увидеть разницу во времени нужно запустить сканирование винта хотя бы на 1ТБ.