재귀적 bash 기능(디렉토리 반복자)

재귀적 bash 기능(디렉토리 반복자)

다음 작업은 더 간단한 "찾기" 주석을 사용하여 수행할 수 있다는 것을 알고 있지만 재귀 호출을 사용하여 솔루션을 구현하려고 합니다. 특정 디렉터리를 조사하고 모든 하위 디렉터리에 있는 파일 이름의 최대 길이를 얻으려고 합니다. 그러나 내 재귀는 한 수준 아래에서만 작동하므로 기본적으로 특정 디렉터리나 해당 하위 디렉터리에서 가장 긴 파일 이름을 반환합니다.

#! /bin/bash

export maxlen=0

findmaxr()
{
        if [ $# -eq  0 ] ; then
        echo "Please pass arguments. Usage: findmax dir"
        exit -1
        fi

        if [ ! -d "$1" ];       then
        echo "No such directory exist."
        exit -2
        fi

        for file in $(/bin/ls $1)
                do
                if [ -d "$file" ] ; then
                        findmaxr $file   # Recursively call the method for subdirectories
                else
                        cur=${#file}
                        if [ $maxlen -lt $cur ] ; then
                                maxlen=$cur
                        fi
                fi
                done

        echo "The file with the longest name has [$maxlen] characters."



}

findmaxr `pwd`

답변1

노력하다:

#! /bin/bash
export maxlen=0

findmaxr()
{
        if [ $# -eq  0 ] ; then
        echo "Please pass arguments. Usage: findmax dir"
        exit 1
        fi

        if [ ! -d "$1" ];       then
        echo "No such directory exist."
        exit 2
        fi

        for file in "$1"/*
                do
                if [ -d "$file" ] ; then
                        findmaxr "$file"   # Recursively call the method for subdirectories
                else
                        f=${file##*/}
                        cur=${#f}
                        if [ $maxlen -lt $cur ] ; then
                                maxlen=$cur
                        fi
                fi
                done
}

findmaxr "$PWD"
echo "The file with the longest name has [$maxlen] characters."

논의하다

다음을 수행하지 마십시오:

for file in $(/bin/ls $1)

파일 이름에 공백이 포함되어 있지 않더라도 구문 분석은 ls여전히 ​​신뢰할 수 없습니다.

이에 비해 이것은 안정적으로 작동합니다.

for file in "$1"/*

또한 이 양식은 하위 디렉터리로 드롭다운하는 데 필요한 상위 디렉터리의 이름을 유지합니다. 예를 들어, 다음 예의 디렉터리 구조를 사용하면 출력에는 ls해당 디렉터리에 대한 기본 파일 이름만 표시됩니다 d 1.

$ ls 'd 1'
12345  d 2

이와 대조적으로 의 출력 'd 1'/*에는 상위 디렉터리의 이름이 포함됩니다.

$ echo 'd 1'/*
d 1/12345 d 1/d 2

상위 디렉토리 이름을 유지함으로써 재귀 작업을 수행할 수 있습니다.

이제 file전체 경로가 포함되었으므로 길이를 결정하기 전에 디렉터리 이름을 제거해야 합니다. 이는 접두사를 제거하여 수행됩니다.

f=${file##*/}

다음 파일 구조를 고려하십시오.

$ find .
.
./d 1
./d 1/12345
./d 1/d 2
./d 1/d 2/1234567
./d 1/d 2/d 3
./d 1/d 2/d 3/123456789
./script

이제 스크립트를 실행해 보겠습니다.

$ bash script 
The file with the longest name has [9] characters.

관련 정보