루프를 사용하여 현재 디렉터리의 파일 수를 찾습니다.

루프를 사용하여 현재 디렉터리의 파일 수를 찾습니다.

파이프를 사용하지 않고 루프를 사용하여 현재 디렉터리의 파일 수를 확인하는 방법이 있는지 궁금합니다.

파일이 3개 있으면 출력은 3이 되어야 합니다.

난 네가 쉽게 할 수 있다는 걸 알아

ls | wc -l 

하지만 파이프를 사용하지 않고 루프에 넣을 수 있는 방법이 있는지 궁금합니다.

감사해요

답변1

echoBash에서는 배열의 요소 수 와 함께 모든 파일을 배열에 추가할 수 있습니다 .

arr=(*)
echo "${#arr[@]}"

답변2

여기 있어요:

files_num=0
for i in *; do 
  (( files_num++ ))
done
echo $files_num

답변3

물론 루프를 사용할 수 있지만 루프가 필요하지 않은데 왜 루프를 사용합니까?

셸에는 디렉터리의 파일을 열거하고 개수를 계산하는 모든 도구가 있습니다. 기본 아이디어(함수에 캡슐화됨)는 다음과 같습니다.

count_files () {
  set *
  echo $#
}

즉, 위치 인수를 현재 디렉터리의 파일 이름 목록으로 설정하고 위치 인수 수를 인쇄합니다. 이는 여러 가지 극단적인 경우로 분류됩니다.

  • 첫 번째 파일 이름이 로 시작하면 -옵션으로 해석됩니다 set. 쉽게 해결해보세요 set -- *.
  • 일치하는 파일이 없으면 *변경되지 않고 그대로 유지됩니다. POSIX 셸로 포팅하려면 이 특별한 경우를 처리해야 합니다. ksh, bash 또는 zsh를 요청할 수 있는 능력이 있다면 더 나은 방법이 있습니다.
  • 여기에는 도트 파일(로 시작하는 파일)은 포함되지 않습니다 .. 개별적으로 포함해야 합니다. glob에는 pdksh와 Forsyth 쉘 및 zsh의 다른 모든 하위 항목을 포함하거나 제외한 도트 파일이 나열됩니다( 비어 .*있지 않은 경우 ). 이것을 계산해서는 안된다고 가정하면 2를 빼십시오....bashGLOBIGNORE

POSIX 솔루션:

count_files () {
  set -- * .*
  if [ "$1" = "*" ] && ! [ -e "$1" ] && ! [ -L "$1" ]; then
    shift # Remove the * which didn't match any file
  fi
  echo $#
}

Ksh93 솔루션:

function count_files {
  typeset FIGNORE='@(.|..)'
  set -- ~(N)
  echo $#
}

쿵쿵거리는 솔루션:

count_files () (
  shopt -s dotglob nullglob
  set -- *
  echo $#
)

zsh 솔루션:

count_files () {
  emulate -LR zsh
  set -- *(DN)
  echo $#
}

관련 정보