파이프를 사용하지 않고 루프를 사용하여 현재 디렉터리의 파일 수를 확인하는 방법이 있는지 궁금합니다.
파일이 3개 있으면 출력은 3이 되어야 합니다.
난 네가 쉽게 할 수 있다는 걸 알아
ls | wc -l
하지만 파이프를 사용하지 않고 루프에 넣을 수 있는 방법이 있는지 궁금합니다.
감사해요
답변1
echo
Bash에서는 배열의 요소 수 와 함께 모든 파일을 배열에 추가할 수 있습니다 .
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를 빼십시오..
..
bash
GLOBIGNORE
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 $#
}