아래 스크립트를 작성했지만 이제 디렉터리에 파일 수에 관계없이 디렉터리의 파일 수에 대해 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 ))
두 가지입니다:
$(( ... ))
산술 확장입니다. 여기서 명령 대체를 수행해야 할 수도 있습니다$( ... )
.wc -l
파일 수는 계산 되지 않습니다 . 출력에서 개행 수를 계산합니다ls
. 이름에 하나 이상의 줄 바꿈이 포함된 파일은 여러 파일로 간주됩니다wc -l
. 를 사용하여 이와 같은 파일을 생성하여 이를 테스트할 수 있습니다touch $'hello\nworld'
.
답변2
숨겨진 파일()을 포함하여 파일 수를 계산 .*
하고 하위 디렉터리를 제외하려면 다음을 사용할 수 있습니다.
find . -maxdepth 1 -type f -printf '.' | wc -c
모든 혜택을 find
누릴 수 있습니다.
답변3
문제는 명령 대체의 구문 오류라고 생각합니다.
주문하다
num=$(( expression ))
대괄호의 내용을 다음과 같이 해석합니다.산수표현식을 입력하고 숫자 결과를 할당합니다 num
.아니요괄호 안에 코드로 작성된 실행의 출력을 반환합니다. 대신, ls
및 wc
는 쉘 변수로 해석되고 "OR 빼기" l
연산이 수행됩니다. 이 "변수" 중 어느 것도 초기화되지 않았기 때문에 결과는 0이 됩니다.$ls
$wc
$l
당신이하고 싶은 일은 다음과 같이 쓰여질 것입니다
num="$(ls | wc -l)"
그러나 그럼에도 불구하고,출력 구문 분석ls
일반적으로 이는 좋은 생각이 아닙니다. 대신 몇 가지 답변을 살펴보세요.이 비슷한 질문파일 이름에 특수 문자가 포함된 경우에도 작동하는 "강력한" 솔루션이 제공됩니다.