다음과 관련해 도움이 필요합니다.
내가 디렉토리에 있고 이 디렉토리 내에 다른 디렉토리와 파일 등이 있다고 가정해 보겠습니다.
재귀 함수를 사용하여 해당 파일과 하위 디렉터리 내의 모든 파일과 디렉터리를 계산하고 싶습니다.
wc... grep 또는 find를 사용하여 문제를 해결할 수 있다는 것을 알고 있지만 여기서는 첫 번째 재귀 함수를 실제로 사용하고 싶습니다.
이것이 내가 지금까지 한 일이지만 작동하지 않습니다.
counting(){
for i in $(ls -a $1)
do
if [ -d $1/$i ];then
let d++
cd $1/$i
counting $i
cd ..
elif [ -f $1/$i ];then
let f++
fi
done
}
counting $1
echo "number of files = $f ; number of directories = $d"
답변1
개선할 수 있는 사항은 다음과 같습니다(완료가 보장되지는 않음).
안 돼요구문 분석된 출력
ls
.
파일이나 디렉터리 이름에 공백이 포함되면(대부분의 최신 파일 시스템에서는 완전히 합법적입니다) 스크립트가 중단됩니다.
대신 셸의 와일드카드 기능을 사용하세요.shopt -s dotglob # to make the * glob match hidden files (like ls -a) for i in "$1"/*
변수는 항상 인용됩니다.
쉘은 공백 문자(공백, 개행 등)를 보고 하나의 명령 인수가 끝나고 다른 명령 인수가 시작되는 위치를 결정합니다. 다음 예를 고려하십시오.filename="foo bar" touch $filename # gets expanded to `touch foo bar`, so it creates two files named "foo" and "bar" touch "$filename" # gets expanded to `touch "foo bar`", so it creates a single file named "foo bar"
너무
cd
많은cd $1/$i counting $i # which in turn calls ... ls -a $1
ls
./foo/bar/bar
- 이것은 구문 분석과 인용되지 않은 변수뿐일 때 디렉토리의 내용을 나열하려고 시도합니다./foo/bar
.