Тема: Рекурсивний алгоритм для отримання списку файлів та директорій

Привіт.
Знадобилося мені зробити рекурсивну функцію для того, щоб їй задавали каталог,
а вона видавала усі підкаталоги(і підкаталоги підкаталогів і тд) і файли.
Спробував зробити, та не зовсім у мене вийшло. В тенетах щось нічого толкового не знайшов.

2

Re: Рекурсивний алгоритм для отримання списку файлів та директорій

так показуйте що маєте, на чому пишете?

3 Востаннє редагувалося Пам'ять не може бути READ (23.02.2013 17:54:14)

Re: Рекурсивний алгоритм для отримання списку файлів та директорій

miroslav.chandler написав:

так показуйте що маєте, на чому пишете?

Пробував на Bash та php, на php вийшло майже повністю, а на баші ні.
Пробую переробити з php на bash, та є деякі труднощі.

4 Востаннє редагувалося Invader (23.02.2013 18:13:56)

Re: Рекурсивний алгоритм для отримання списку файлів та директорій

Гляньте на ось  це.

Код з однієї книги який, нажаль, просто страшно навантажує ЦП:

<?php
function recurseTree($oIterator){
while($oIterator->valid()){
    if($oIterator->isDir() && !$oIterator->isDot()){
        echo $oIterator."(Dir ". $oIterator->key().")<br>";
        if($oIterator->hasChildren()){
            recurseTree($oIterator->getChildren());
        } elseif ($oIterator->isFile()){
            echo $oIterator."(File ".$oIterator->key().")<br>";
        }
        $oIterator->next();
    }
}
}
recurseTree(new recursiveDirectoryIterator('.'));#шлях до каталога

5 Востаннє редагувалося Пам'ять не може бути READ (23.02.2013 18:34:11)

Re: Рекурсивний алгоритм для отримання списку файлів та директорій

Ось напрацювання на Bash.

#/bin/bash
 start_folder="/home/hanti/bootstrap/css"

 function scan()
 {
     folder=$1
     ls $folder > ls.txt
     
     index=0
    while read file 
     do
    
     item="$folder/$file"
     echo "$folder/$file"

      if [ -d "$item" ]
       then
        scan $item
       fi
     
     index=$(($index+1))
    done < ls.txt
 
 }
 scan $start_folder

Проблема лише у тому, що я якщо у каталозі є наприклад директорії dir1,dir2,dir3
то сканує воно лише dir1, а решту ні.

Тільки но опублікував це повідомення, як зразу ж побачив помилку.
Зараз постараюся виправити.

Re: Рекурсивний алгоритм для отримання списку файлів та директорій

Як виявилося, те що я побачив, не було помилкою.
Але скрипт надалі працює неправильно.

7

Re: Рекурсивний алгоритм для отримання списку файлів та директорій

тільки папки?

8 Востаннє редагувалося Пам'ять не може бути READ (23.02.2013 19:27:37)

Re: Рекурсивний алгоритм для отримання списку файлів та директорій

Ось php код:

<?php

$start_folder = '/home/hanti/bootstrap/css';

function scan($folder) 
{
        $files = scandir ($folder);
        foreach ($files as $file) 
            {
            if (($file == '.') || ($file == '..') ) continue;
            $item = $folder.DIRECTORY_SEPARATOR.$file;
             echo $folder.DIRECTORY_SEPARATOR.$file."\n";

            if (is_dir ($item)) 
                scan($item);
            }
    }
        
scan($start_folder); 

?>

Результат виконання:

/home/hanti/bootstrap/css/bootstrap-responsive.css
/home/hanti/bootstrap/css/bootstrap-responsive.min.css
/home/hanti/bootstrap/css/bootstrap.css
/home/hanti/bootstrap/css/bootstrap.min.css
/home/hanti/bootstrap/css/Нова
/home/hanti/bootstrap/css/Нова/Текстовий файл
/home/hanti/bootstrap/css/Нова1
/home/hanti/bootstrap/css/Нова1/Нова2
/home/hanti/bootstrap/css/Нова1/Нова2/Текстовий
/home/hanti/bootstrap/css/Текстовий файл
/home/hanti/bootstrap/css/Файл HTML

А ось результат виконання bash скрипта.

/home/hanti/bootstrap/css
/home/hanti/bootstrap/css/bootstrap.css
/home/hanti/bootstrap/css/bootstrap.min.css
/home/hanti/bootstrap/css/bootstrap-responsive.css
/home/hanti/bootstrap/css/bootstrap-responsive.min.css
/home/hanti/bootstrap/css/Нова
/home/hanti/bootstrap/css/Нова
/home/hanti/bootstrap/css/Нова/Текстовий файл

9

Re: Рекурсивний алгоритм для отримання списку файлів та директорій

Ось цілком робоча програма із документації:

<?php

$path = realpath('/etc');

$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST);
foreach($objects as $name => $object){
    echo "$name\n";
}

?>

Re: Рекурсивний алгоритм для отримання списку файлів та директорій

Та мені б бажано на Bash.

Re: Рекурсивний алгоритм для отримання списку файлів та директорій

miroslav.chandler написав:

тільки папки?

Що ви маєте на увазі ?

12

Re: Рекурсивний алгоритм для отримання списку файлів та директорій

Надибав тут:

recursiverm() {
  for d in *; do
    if [ -d $d ]; then
      echo $d
      (cd $d; recursiverm)
    fi
      echo $d
  done
}

Переходимо в потрібну директорії і викликаємо функцію. Але якісь проблеми з обробкою імен файлів (мабуть) — bash: [: phone: binary operator expected

Re: Рекурсивний алгоритм для отримання списку файлів та директорій

Invader написав:

Надибав тут:

recursiverm() {
  for d in *; do
    if [ -d $d ]; then
      echo $d
      (cd $d; recursiverm)
    fi
      echo $d
  done
}

Переходимо в потрібну директорії і викликаємо функцію. Але якісь проблеми з обробкою імен файлів (мабуть) — bash: [: phone: binary operator expected

Скрипт підправив. Як виявилося, я робив велосипед.
Командою ls -R можна отримати аналогічний результат, щоправда для подальшої
роботи з результатом  ls -R треба дещо з регулярками пошаманити.

14

Re: Рекурсивний алгоритм для отримання списку файлів та директорій

А так не підійде?

cd mydir
MYVAR=`ls -R`

for line in $MYVAR;
do echo $line;
done

15 Востаннє редагувалося Invader (23.02.2013 22:26:28)

Re: Рекурсивний алгоритм для отримання списку файлів та директорій

Мені здавалося що потрібне не готове рішення, а код (алгоритм). Але якшо так, то є ще отаке:

tree -if --noreport .
tree -if --noreport directory/

тільки програму tree тре встановлювати окремо.
Опис програми:

Description-en: displays directory tree, in color
 Displays an indented directory tree, using the same color assignments as
 ls, via the LS_COLORS environment variable.