LINUX.ORG.RU

Рекурсивный обход поддиректорий

 , ,


0

1

Здравствуйте, вот уже который час пытаюсь сделать простенький скрипт, но не выходит. На любом языке программирования без проблем бы сделал, а со скриптом что-то не получается, видно что-то не так понял в синтаксисе. Никак не могу сделать. Нужно сделать такой скрипт который начиная от текущей директории идет рекурсивно по папкам и считает количество файлов в каждой из них. Если количество файлов больше 10, то добавляется в файл с именем BigList, иначе в ShortList. Мой скрипт работает как попало. Видно что я что-то с переменными сделал, что при выходе из рекурсии переменные не имеет того же значения что и до рекурсии. Нужно сделать скрипт без использования других команд, таких как find и так далее. Вот собственно сам скрипт. Подскажите пожалуйста что не так.

 
#!/bin/bash
parent_dir=""
if [ -d "$1" ]; then
    path=$1;
else
    path=$(pwd)
fi
parent_dir=$path
loop_folder_recurse() { 
    local files_list=""      
    local cnt=0
    for i in "$1"/*;do
        if [ -d "$i" ];then
            echo "dir: $i"
            parent_dir=$i               
            echo before recursion
            loop_folder_recurse "$i"
            echo after recursion
            if [ $cnt -ge 10 ]; then
                echo -e "---"$parent_dir >> BigList
                echo -e $file_list >> BigList
            else
                echo -e "---"$parent_dir >> ShortList
                echo -e $file_list >> ShortList
            fi
        elif [ -f "$i" ]; then
            echo file $i
            if [ $cur_fol != $main_pwd ]; then
                file_list+=$i'\n'
                cnt=$((cnt + 1))
            fi
        fi
    done
}
echo "Base path: $path"
loop_folder_recurse $path 



Последнее исправление: cetjs2 (всего исправлений: 2)

добавь в первой строчке (важно именно в первой строчке эту строку писать), «+x»

#!/bin/bash +x
увидишь что у тебя в коде происходит, если слишком много всего, перенаправь в файл и проверяй так ли ты думал или нет.
$ ./run.sh >log 2>&1

anonymous
()

Видно что я что-то с переменными сделал, что при выходе из рекурсии переменные не имеет того же значения что и до рекурсии.

не прочитал про видимость переменных.

#!/bin/bash

f() {
  local q=2
  echo "1>$q $w"
  q=7; w=5
  echo "2>$q $w"
}
q=3
echo "3>$q $w"
f
echo "4>$q $w"

echo "5>$e"
for i in 1 2 3; do
  echo "6>$e, $i"
  e=$i
  echo "7>$e"
done
echo "8>$e"

anonymous
()

на shell не стоит писать что-то серьёзнее скрипта на пару строк

anonymous
()
Ответ на: комментарий от anonymous

без использования других команд, таких как find и так далее

anonymous
()

Нужно сделать скрипт без использования других команд, таких как find и так далее.

Может ещё без использования ОС? Откуда такие дебильный задания берёте?

mix_mix ★★★★★
()
Ответ на: комментарий от b0c0813f

Спасибо всем буду пробовать . Меня просто вдохновила вот эта фраза из статьи про написание скриптов. # Действительно ли bash допускает рекурсию? # Да! Но... # Нужно быть действительно дубинноголовым, чтобы использовать ее в сценариях # на языке командной оболочки.

CROSP
() автор топика
folders () { [ `ls | wc -l` -ge 10 ] && pwd >> /tmp/big || pwd >> /tmp/small; for f in *; do if [ -d "$f" ]; then pushd "$f"; folders; popd; fi; done; }

Тут из внешних команд только ls и wc. pwd, pushd, popd — встроенные в шелл команды. Или совсем без внешних команд? Тогда

folders () { let "count = 0"; for f in *; do let "count += 1"; if [ -d "$f" ]; then pushd "$f"; ( folders ); popd; fi; done; [ $count -ge 10 ] && pwd >> /tmp/big || pwd >> /tmp/small; }

Тут чтобы вызов функции не портил мне переменную count вызов folders был написан в круглых скобках, чтобы создался подшелл. Но если у тебя есть ограничение на количество процессов, то лучше написать так:

folders () { local count=0; for f in *; do let "count += 1"; if [ -d "$f" ]; then pushd "$f"; folders; popd; fi; done; [ $count -ge 10 ] && pwd >> /tmp/big || pwd >> /tmp/small; }
kim-roader ★★
()

ls -laR | а тут грамотный grep

и вуаля.

MikeDM ★★★★★
()

патриархи(при перепроектирование юникса в план9) рекомендуют для входного дерева использовать du которая для данного пути даёт лист имён листов.

qulinxao ★★☆
()

без использования других команд, таких как find и так далее

Ржал в этом месте =)

I-Love-Microsoft ★★★★★
()

Оберни loop_folder_recurse "$i" в круглые скобки. Это запустит новый экземпляр оболочки, в котором переменные будут уже свои собственные.

E ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.