Linux.org.ua

Технічні питання => Розробка => Гілку створено: Yola від 2012-02-07 14:42:20

Тема: Рекурсивний обхід підтек(піддиректорій) - (recursive folder traversal
Автор: Yola від 2012-02-07 14:42:20
Наступний код зациклюється на "."? Я ж вставив перевірку...
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 .
Тема: Re: Рекурсивний обхід підтек
Автор: Yola від 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 рази...
Тема: Re: Рекурсивний обхід підтек
Автор: Володимир Лісівка від 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 "$@"
Тема: Re: Рекурсивний обхід підтек
Автор: Yola від 2012-02-07 15:41:02
Ви ніндзя!!! Але чому в моєму коді по чотири рази, дуже цікаво))

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

Розібрався!!! Перевірку на наявність файлу треба було ставити після переходу по cd.
Тема: Re: Рекурсивний обхід підтек(піддиректорій) - (recursive folder trave
Автор: Михайло Даниленко від 2012-02-07 17:09:49
Не зовсім відповідь на ваше питання, але я би зробив це на основі find -type d -print0 | xargs -0 script.sh
Зокрема, даний конкретний код можна замінити просто find -type f -name 'lock'