Нужен скрипт поиска самой глубокой папки

Discussion in 'PHP' started by Billar, 31 Oct 2012.

  1. Billar

    Billar Banned

    Joined:
    9 Jul 2012
    Messages:
    15
    Likes Received:
    5
    Reputations:
    5
    В общем даже не знаю как это сделать (работаю без остановки уже вторые сутки, мозг практически не варит), а функция для поиска срочно нужна.

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

    Скрипт PHP
     
    #1 Billar, 31 Oct 2012
    Last edited: 31 Oct 2012
    1 person likes this.
  2. Billar

    Billar Banned

    Joined:
    9 Jul 2012
    Messages:
    15
    Likes Received:
    5
    Reputations:
    5
    Нет. Ищу самую глубокую папку, для заливки
    http://screenshotuploader.com/s/01/238wx1h0y
     
  3. Adio

    Adio Elder - Старейшина

    Joined:
    23 May 2005
    Messages:
    1,646
    Likes Received:
    148
    Reputations:
    18
    можно пхп скриптом найти тебе на чем ?
     
  4. Billar

    Billar Banned

    Joined:
    9 Jul 2012
    Messages:
    15
    Likes Received:
    5
    Reputations:
    5
    Скриптом на пхп ясное дело. Забыл указать в первом посте... явно недосып.
    пробовал делать функцию с опендиром и искать рекурсивно, но столкнулся с проблемой, когда находиться самая глубокая папка, то внутри нету папок и как об этом сказать функции, чтобы та прекратила поиск дальше и ретурнула путь к папке - хз
     
  5. VY_CMa

    VY_CMa Green member

    Joined:
    6 Jan 2012
    Messages:
    917
    Likes Received:
    492
    Reputations:
    724
    _________________________
  6. Billar

    Billar Banned

    Joined:
    9 Jul 2012
    Messages:
    15
    Likes Received:
    5
    Reputations:
    5
    Не вариант, по скольку иногда такой скрипт будет выполняться вечность (бывают хостинги с кучей папок и файлов).

    Мне нужно только найти самую глубокую папку по прямой линии (т.е. указал директорию, там выбирается список папок, рандомно выбирается любая папка и дальше по прямой линии ищется самая глубокая)
     
  7. Adio

    Adio Elder - Старейшина

    Joined:
    23 May 2005
    Messages:
    1,646
    Likes Received:
    148
    Reputations:
    18
    Де то было не могу найти, в гугле Scan folder php
     
  8. neofit

    neofit Banned

    Joined:
    14 Nov 2009
    Messages:
    223
    Likes Received:
    14
    Reputations:
    0
    http://www.sant-media.co.uk/2010/03/bash-script-to-scan-folders-and-php-files-for-bad-permissions/#codesyntax_1 Не?
     
  9. Billar

    Billar Banned

    Joined:
    9 Jul 2012
    Messages:
    15
    Likes Received:
    5
    Reputations:
    5
    Во первых - это баш, во вторых он чекает права...
    Совсем не то, что мне нужно.
     
  10. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,170
    Likes Received:
    1,155
    Reputations:
    202
    http://php.net/manual/ru/class.directoryiterator.php
    на выходе будет массив с путями ко всем файлам, потом разбиваешь елементы массива на вхождения через explode и у кого больше всего вхождений тот и победил.
     
    1 person likes this.
  11. Billar

    Billar Banned

    Joined:
    9 Jul 2012
    Messages:
    15
    Likes Received:
    5
    Reputations:
    5
    Спасибо, с меня печенька. Именно то что и искал!
    Сделал, все работает :)

    апдейт
    Время работы у этого класса конечно просто жесть, но хоть что-то.
     
  12. Иван8

    Иван8 Elder - Старейшина

    Joined:
    21 Aug 2008
    Messages:
    71
    Likes Received:
    11
    Reputations:
    6
    Чет я сразу БД и АВЛ деревья вспомнил))

    Берешь все папка в указанной директории;
    смотришь на какую есть права;
    переходишь в нее и повторяешь с начала;
    если нету папок
    возвращаешь путь к этой директории;
    выводишь пути в порядке уменьшения длины!)
     
  13. |qbz|

    |qbz| Banned

    Joined:
    25 Dec 2009
    Messages:
    385
    Likes Received:
    169
    Reputations:
    65
    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_boobsdeepthroat($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/')).
     
    #13 |qbz|, 1 Nov 2012
    Last edited: 1 Nov 2012
    1 person likes this.
  14. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,170
    Likes Received:
    1,155
    Reputations:
    202
    Вот еще на 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($filesglob_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]#
    Этот вариант побыстрее чем оба предыдущих.
     
  15. Qwert321

    Qwert321 Banned

    Joined:
    25 Jan 2009
    Messages:
    33
    Likes Received:
    0
    Reputations:
    0
    Чёт вы тупите... :) ...когда-то писал для себя
    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
     
  16. |qbz|

    |qbz| Banned

    Joined:
    25 Dec 2009
    Messages:
    385
    Likes Received:
    169
    Reputations:
    65
    Скажи мне, b3, как может работать рекурсия (!) с еррей_мердж (сохраняет значит все результаты) быстрее функции, которая исключает пути, которые являются лишними (то есть из /а/, /д/б/, /д/ц/ будет исключен /а/ ибо там уже глубже не идет).

    Неа, ребят, любой рекурсивный код тут будет сохранять вся и все, что не приемлимо если работа идет с большим обьемом. Почитайте мой код, особенно функцию двойной анальной пенетрации и там все четко и понятно написано каким образом идет фильтрация.
     
  17. Billar

    Billar Banned

    Joined:
    9 Jul 2012
    Messages:
    15
    Likes Received:
    5
    Reputations:
    5
    Итератор меня задолбал своей медленностью и хорошенько выспавшись, сбацал данный скриптик, со всем, что мне нужно было сделать.
    Сокрость работы отличная, результат даже лучше чем нужен был.

    Т.е. для моей задачи (заливка доров в самую глубокую директорию) + рандомизация директорий, чтобы доры лились не в статическую директорию - это именно то, что и требовалось. (к тому-же такая рандомизация, существенно экономит время выполнения скрипта)

    пользуйтесь, может кому-то еще и пригодится.

    Работает так: берет рандомную директорию и по ней сканирует самую глубокую.

    пасаны, конечно спасибо, но пока от вас дождешься помощи, я уже отцом стать могу.
    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(0count($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]) > 0quick_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]) > 0rescan($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// Вывод результата работы функции
    }

    ?>
     
    #17 Billar, 1 Nov 2012
    Last edited: 1 Nov 2012
  18. |qbz|

    |qbz| Banned

    Joined:
    25 Dec 2009
    Messages:
    385
    Likes Received:
    169
    Reputations:
    65
    Мой вариант должен сканить все диры без исключения на мегабыстрой скорости (я не тестил, но поидее так должно быть).
     
  19. Qwert321

    Qwert321 Banned

    Joined:
    25 Jan 2009
    Messages:
    33
    Likes Received:
    0
    Reputations:
    0
    Ну ты тогда мысли формируй правильно, а то тебе сначала одно надо ...а потом вдруг рандомнасть нужна
     
  20. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,170
    Likes Received:
    1,155
    Reputations:
    202
    Запусти бенчмарк проверь, мой код быстрее твоего. А по большому счету что бы увидеть разницу во времени нужно запустить сканирование винта хотя бы на 1ТБ.