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