
이렇게 하면 ls -1 target_dir | wc -l
디렉터리에 있는 파일 개수를 얻을 수 있습니다. 나는 이것이 약간 문제가 있다고 생각합니다. 더 우아하고 간결한 방법이 있습니까?
답변1
bash 4+(지원되는 모든 Ubuntu 버전에서 사용 가능)를 가정:
num_files() (
shopt -s nullglob
cd -P -- "${1-.}" || return
set -- *
echo "$#"
)
호출하는 것은 선택 사항입니다 num_files [dir]
. dir
그렇지 않으면 현재 디렉터리가 사용됩니다. 원본 버전은 숨겨진 파일을 계산하지 않으므로 숨겨진 파일도 계산하지 않습니다. 원한다면 shopt -s dotglob
전에 set -- *
.
원래 예에서는 일반 파일뿐만 아니라 디렉터리 및 기타 장치도 계산합니다. 실제로 일반 파일(일반 파일에 대한 심볼릭 링크 포함)만 필요한 경우 이를 확인해야 합니다.
num_files() (
local count=0
shopt -s nullglob
cd -P -- "${1-.}" || return
for file in *; do
[[ -f $file ]] && let count++
done
echo "$count"
)
GNU 찾기가 있는 경우 다음과 같은 것도 옵션입니다(여기에는 원래 명령이 수행하지 않는 숨겨진 파일이 포함된다는 점에 유의하세요).
num_files() {
find "${1-.}" -maxdepth 1 -type f -printf x | wc -c
}
(일반 파일에 대한 심볼릭 링크도 계산하려면 이것을 변경하십시오 -type
).-xtype
답변2
f=(target_dir/*);echo ${#f[*]}
이름에 공백, 개행 등이 포함된 파일에 적합합니다.
답변3
ls
멀티컬럼은 단말에 직접 출력할 때만 "-1" 옵션을 제거하면 되고, wc
"-l" 옵션을 제거하고 첫 번째 값만 읽을 수 있습니다. 임무, 전술 작전...).
ls target | wc
답변4
Aaron의 방법은 여러분의 방법보다 훨씬 더 깨끗한 방법입니다. 보다 정확한 버전의 접근 방식은 다음과 같습니다.
ls -aR1q | grep -Ecv '^\./|/$|^$'
인쇄할 수 없는 문자를 바꾸는 데 필요한 쉘 글로브를 사용하여 현재 디렉토리의 .dotfiles를 포함하여 모든 파일(디렉토리 아님)을 한 줄에 하나씩 반복적으로 나열합니다. grep은 상위 디렉토리 목록이나 .., */ 또는 빈 줄을 필터링하므로 파일당 한 줄만 있어야 합니다. grep은 총 개수를 반환합니다. 하위 디렉터리도 포함하려면 다음을 수행하세요.
ls -aR1q | grep -Ecv '^\.{1,2}/|^$'
-R
재귀적인 결과를 원하지 않으면 두 사례 중 하나를 제거하십시오.