Автор Гілка: Рекурсивний обхід підтек(піддиректорій) - (recursive folder traversal  (Прочитано 3020 раз)

Відсутній Yola

  • Дописувач
  • **
  • дописів: 70
  • Карма: +0/-0
  • http://uk.wikipedia.org/wiki/User:Igor_Yalovecky
Наступний код зациклюється на "."? Я ж вставив перевірку...
r ()
{
    if [ -f "$1/lock" ]; then
        echo $1/lock
    fi;
    echo $1
    for d in $(ls $1 -a)
    do
              if [[ $d!="." && $d!=".." ]]; then
                      if [[ -d "$d" ]]; then
                            echo "<<$d>>"
                                   ( r "$d" )
                        fi;
              fi;
    done
}

r .
« Змінено: 2012-02-07 15:42:35 від Yola »

Відсутній Yola

  • Дописувач
  • **
  • дописів: 70
  • Карма: +0/-0
  • http://uk.wikipedia.org/wiki/User:Igor_Yalovecky
Re: Рекурсивний обхід підтек
« Відповідей #1 : 2012-02-07 15:25:44 »
Поки що дійшов до цього:
r ()
{
    if [ -f "lock" ]; then
              echo `pwd`"/lock"
    fi;
    cd $1
    for d in $(ls -a)
    do      
                if [ $d != '.' ]; then
                if [ $d != '..' ]; then
                            if [ -d "$d" ]; then
                                            ( r "$d" )
                            fi;
                fi;
                fi;
    done
}

r .
Виводить потрібні файли, але чомусь по 4 рази...
« Змінено: 2012-02-07 15:26:08 від Yola »

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
Re: Рекурсивний обхід підтек
« Відповідей #2 : 2012-02-07 15:30:21 »
#!/bin/bash

set -ue

r() {
  local DIR="$1"

  [ -d "$DIR" ] || return

  if [ -f "$DIR/lock" ]
  then
    echo "$DIR/lock"
  fi

  local DIRENTRY
  for DIRENTRY in "$DIR"/.* "$DIR"/*
  do
    case "$DIRENTRY" in
      .|..|*/.|*/..)  continue ;;
    esac

    if [ -d "$DIRENTRY" ]
    then
      echo "<<$DIRENTRY>>"
      r "$DIRENTRY"
    else
        echo "  $DIRENTRY"
    fi
  done
}

r "$@"
[Fedora Linux]

Відсутній Yola

  • Дописувач
  • **
  • дописів: 70
  • Карма: +0/-0
  • http://uk.wikipedia.org/wiki/User:Igor_Yalovecky
Re: Рекурсивний обхід підтек
« Відповідей #3 : 2012-02-07 15:41:02 »
Ви ніндзя!!! Але чому в моєму коді по чотири рази, дуже цікаво))

Все зараз розберусь, це відбувається за кількістю підтек у теки з файлом.

Розібрався!!! Перевірку на наявність файлу треба було ставити після переходу по cd.
« Змінено: 2012-02-07 15:46:17 від Yola »

Відсутній Михайло Даниленко

  • Адміністратор ЩОДО
  • Літератор
  • *****
  • дописів: 1262
  • Карма: +0/-0
  • [Debian Stretch]
Не зовсім відповідь на ваше питання, але я би зробив це на основі find -type d -print0 | xargs -0 script.sh
Зокрема, даний конкретний код можна замінити просто find -type f -name 'lock'