.sh 파일을 사용하여 디렉터리의 파일 수를 반환합니다.

.sh 파일을 사용하여 디렉터리의 파일 수를 반환합니다.

아래 스크립트를 작성했지만 이제 디렉터리에 파일 수에 관계없이 디렉터리의 파일 수에 대해 0을 반환합니다.

source ~/Alan/assign/changeDir.sh
num=$(( ls | wc -l ))
echo $num

ChangeDir.sh 스크립트는 다음과 같습니다

function my_cd() {
cd ~/Alan
}

나에게 필요한 것은 나중에 동일한 스크립트에서 사용할 수 있도록 숫자를 반환하는 것입니다. 이에 대한 지침을 주시면 정말 감사하겠습니다. 감사해요

답변1

단일 디렉토리에 있는 이름 수를 찾으려면 *그 안에 있는 glob을 확장하고 생성된 단어 수를 계산합니다.

shopt -s nullglob    # to make the * glob expand to nothing
                     # if there is no matching names
set -- *
num=$#

printf '%s\n' "$num"

특별한 값 $#은 위치 인수의 수입니다. 이 set명령은 위치 매개변수를 설정합니다.

세어보고 싶나요?정기적인파일만 포함하고 숨겨진 이름을 포함시킨 다음

shopt -s nullglob dotglob

for name in *; do
    if [ ! -f "$name" ] || [ -L "$name" ]; then
        # skip non-regular files and symbolic links
        continue
    fi
    files+=( "$name" )
done

num=${#files[@]}

printf '%s\n' "$num"

하위 디렉터리에서 이 작업을 반복적으로 수행하려면 globstar셸 옵션도 설정하고 이를 **/*글로빙 패턴으로 사용하세요.

( zsh쉘에서는 을 사용해도 충분합니다 set -- **/*(.DN); print $#)

너의 문제

num=$(( ls | wc -l ))

두 가지입니다:

  1. $(( ... ))산술 확장입니다. 여기서 명령 대체를 수행해야 할 수도 있습니다 $( ... ).
  2. wc -l파일 수는 계산 되지 않습니다 . 출력에서 개행 수를 계산합니다 ls. 이름에 하나 이상의 줄 바꿈이 포함된 파일은 여러 파일로 간주됩니다 wc -l. 를 사용하여 이와 같은 파일을 생성하여 이를 테스트할 수 있습니다 touch $'hello\nworld'.

답변2

숨겨진 파일()을 포함하여 파일 수를 계산 .*하고 하위 디렉터리를 제외하려면 다음을 사용할 수 있습니다.

find . -maxdepth 1 -type f -printf '.' | wc -c

모든 혜택을 find누릴 수 있습니다.

답변3

문제는 명령 대체의 구문 오류라고 생각합니다.

주문하다

num=$(( expression ))

대괄호의 내용을 다음과 같이 해석합니다.산수표현식을 입력하고 숫자 결과를 할당합니다 num.아니요괄호 안에 코드로 작성된 실행의 출력을 반환합니다. 대신, lswc는 쉘 변수로 해석되고 "OR 빼기" l연산이 수행됩니다. 이 "변수" 중 어느 것도 초기화되지 않았기 때문에 결과는 0이 됩니다.$ls$wc$l

당신이하고 싶은 일은 다음과 같이 쓰여질 것입니다

num="$(ls | wc -l)"

그러나 그럼에도 불구하고,출력 구문 분석ls일반적으로 이는 좋은 생각이 아닙니다. 대신 몇 가지 답변을 살펴보세요.이 비슷한 질문파일 이름에 특수 문자가 포함된 경우에도 작동하는 "강력한" 솔루션이 제공됩니다.

관련 정보