if 문 처리

if 문 처리

코드를 강화했습니다질문이전에 게시한 적이 있습니다:

내 코드는 다음과 같습니다

DIR="$1"


if [ -e "$DIR" ]

then

     echo -n "total directories:" ; find $DIR -type d | wc -l

     echo -n "total files:" ; find $DIR -type f | wc -l
else
if [ -f "$DIR" ]
then
    echo " Directory doesn't exist"

else
     echo  " please pass correct arguments"
fi
fi

./countfiledirsor를 수행하면 다음 코드가 출력됩니다 countfiledirs jhfsakl.

sreekanth@sreekanth-VirtualBox:~$  ./countfiledirs 
 please pass correct arguments
sreekanth@sreekanth-VirtualBox:~$  ./countfiledirs ffff
 please pass correct arguments

스크립트 이름을 실행할 때 ./countfiledirs출력을 원합니다.

please pass correct arguments

./countfiledirs ffff다음의 경우 :

directory doesn't exists

스크립트를 실행할 때 코드에 또 다른 문제가 있습니다 ./countfiledirs /usr/share. 내가 제공한 경로에 대한 실제 디렉터리 및 하위 디렉터리 수는 제공되지 않습니다. 3개 대신 4개의 디렉터리 표시

답변1

존재하는 경우 [ -f "$DIR" ]참인지 테스트합니다.$DIR파일입니다. 그것은 당신이 원하는 것이 전혀 아닙니다. 이전 질문에서 제안한 것처럼 $#매개변수가 전달되었는지 확인하는 데 사용해야 합니다. 그런 다음 다음을 사용하여 -e매개변수가 존재하는지 확인할 수 있습니다.

다음 호에는 현재 카탈로그 도 find나열 됩니다. 이를 방지하기 위해 GNU를 .사용할 수 있습니다 .-mindepth 1find

DIR="$1"

if [ $# -lt 1 ]
then
    echo "Please pass at least one argument" && exit   
fi
if [ -e "$DIR" ]
then
     echo -n "total directories:" ; find "$DIR" -mindepth 1 -type d | wc -l
     echo -n "total files:" ; find $DIR -type f | wc -l
else
      echo "Directory doesn't exist"
fi

위의 내용을 다음과 같이 압축할 수도 있습니다(이 버전은 디렉터리가 아닌 존재하지 않는 디렉터리와 파일을 구분하지 않지만).

dir="$1"
[ $# -lt 1 ] && echo "Please pass at least one argument" && exit
[ -d "$dir" ] && printf "total directories: %s\ntotal files:%s\n" \
              $(find "$dir" -type d | wc -l) $(find "$dir" -type f | wc -l) ||
    printf "%s\n" "There is no directory named '$dir'."

답변2

마지막 조건에서 볼 수 있듯이 $DIR이 "일반 파일"을 참조하는지 확인하고 있습니다. 즉, 디렉토리가 아닙니다. 따라서 항상 실패하고(아마도 항상 디렉토리를 제공하기 때문에) "올바른 인수를 전달하십시오"를 인쇄합니다.

디렉터리 개수가 "잘못"된 경우는 그렇지 않습니다. 스크립트에서와 같이 find 명령을 수동으로 실행하면 검색 루트 디렉터리와 하위 디렉터리가 반환되는 것을 볼 수 있습니다. 따라서 주어진 디렉터리를 계산하고 있다는 것을 알 수도 있고, find를 호출한 후 단순히 개수를 줄여 원하는 답을 얻을 수도 있습니다.

이것이 당신이 찾고있는 것 같습니다. 양해해 주세요. 저는 이것이 효과가 있음을 입증했지만 BASH 전문가는 아닙니다.

DIR="$1"

if [ ! -d "$DIR" ]  #If not a directory, 
then
    echo " please pass correct arguments"
    exit 1
fi

# We know for sure $DIR is present and a directory, so we know
# that it will show up in the find results for type d. Decrement.
echo -n "total directories:" $(($(find $DIR -type d | wc -l) - 1))
echo
echo -n "total files:" ; find $DIR -type f | wc -l

관련 정보