답변:
"파일"의 광범위한 정의 사용
ls | wc -l
숨겨진 파일은 포함되지 않으며 파일 이름에 줄 바꿈 문자가 포함되지 않는다고 가정합니다.
숨겨진 파일 ( .
및 제외 ..
) 을 포함하고 개행 문자의 문제점을 피 하려면 다음 과 같은 표준 방법을 사용하십시오.
find . ! -name . -prune -print | grep -c /
또는 재귀 적으로 :
find .//. ! -name . -print | grep -c //
wc
"단어 수"프로그램입니다. -l
스위치 라인을 계산이됩니다. 이 경우의 출력에서 행을 계산합니다 ls
. 이것은 항상 주어진 디렉토리에 대한 파일 수를 얻는 방법을 항상 배웠습니다.
ls
않습니다 ls -1
출력은 파이프 인 경우입니다.
ls -la
하면 디렉토리에 세 줄이 생깁니다. 및 항목 ls -lA | wc -l
을 건너 뛰고 싶습니다 . 그러나 당신은 여전히 하나 하나 떨어져있을 것입니다. .
..
ls -q | wc -l
.-숨겨진 파일은이 방법으로 계산되지 않으며 디렉토리도 계산됩니다.
파일의 좁은 정의 :
find . -maxdepth 1 -type f | wc -l
-maxdepth 1
파일을 재귀 적으로 계산 하기 위해를 생략 하거나 원하는 최대 검색 깊이에 맞게 조정할 수 있습니다.
find -maxdepth 1 -type f -printf "\n" | wc -l
ls -1 | wc -l
...
$ ls --help | grep -- ' -1'
-1 list one file per line
...
$ wc --help | grep -- ' -l'
-l, --lines print the newline counts
PS : 참고 ls-<번호-하나> | 화장실-<letter-l>
ls
수행 -1
됩니다.
[[ -p /dev/stdin ]] && echo "stdin is from a pipe"
아마도 ls
/ wc
pair를 사용하는 가장 완전한 대답 은
ls -Aq | wc -l
도트 파일을 세고 싶다면
ls -q | wc -l
그렇지 않으면.
-A
도트 파일을 계산하지만, 생략하는 것입니다 .
및 ..
.-q
만들기 ls
와 비 그래픽 문자, 특히 개행 문자를 대체 ?
각 파일에 대해 출력 1 개 라인을 만들고,ls
터미널 에서 한 줄 출력을 얻으려면 (즉 wc
, 으로 파이핑하지 않고 ) -1
옵션을 추가해야합니다.
( ls
coreutils 8.23 으로 테스트 한 동작 )
-1
필요하지 않습니다. "콘솔 출력을 사용하여 파일 이름의 줄 바꿈을 처리 합니다 "와 관련하여 이것은 "인쇄 할 수없는 파일 이름 문자 및 <tab> 문자의 각 인스턴스를 강제 로 작성하는 -q
스위치 ( -b
휴대용이 아니라 대신 사용해야 함) 때문 입니다. <question-mark> ( '?') 문자로 구현됩니다. 구현이 출력이 터미널 장치 인 경우 기본적으로이 옵션을 제공 할 수 있습니다. " 예 ls -Aq | wc -l
를 들어 모든 파일 / 디렉토리 ls -qp | grep -c /
를 계산 하거나 숨겨지지 않은 디렉토리 만 계산하려면 ...
-b
되었습니다 -q
.
현재 디렉토리에 숨겨지지 않은 파일이 하나 이상 포함되어있는 경우 :
set -- *; echo "$#"
이것은 모든 글로브에 대해 일반화 할 수 있습니다.
스크립트에서 이는 위치 매개 변수를 겹쳐 써서 유감스럽게도 부작용이있는 경우가 있습니다. 서브 쉘을 사용하거나 다음과 같은 함수 (Bourne / POSIX 버전)를 사용하여이를 해결할 수 있습니다.
count_words () {
eval 'shift; '"$1"'=$#'
}
count_words number_of_files *
echo "There are $number_of_files non-dot files in the current directory"
다른 해결책은 $(ls -d -- * | wc -l)
입니다. glob가 *
이면 명령을 단축 할 수 있습니다 $(ls | wc -l)
. 출력 결과를 파싱하면 ls
항상 불편하지만 파일 이름에 줄 바꿈이 포함되어 있지 않거나 ls
이스케이프 처리되지 않는 한 작동 합니다. 그리고 $(ls -d -- * 2>/dev/null | wc -l)
일치하지 않는 glob의 경우를 정상적으로 처리 할 수 있다는 장점이 있습니다 (즉,이 경우 0을 반환하지만 set *
glob이 비어있는 경우이 방법을 엄밀하게 테스트해야 함).
파일 이름에 개행 문자가 포함될 수있는 경우 다른 방법을 사용하는 것 $(ls -d ./* | grep -c /)
입니다.
일치하는 파일이 많으면 glob의 확장을 전달하는 데 의존하는 솔루션이 인수 목록에 너무 긴 오류로 ls
실패 할 수 있습니다.
local
거나 제거해야합니다 : eval $1=$#
또는 그냥 사용 echo $#
하고하십시오 number_of_files=$(count_words *)
.
$#
당신이 하나를 뺀 것 입니까 (편집하기 전에 그렇게하지 않았습니까)?
$1
. 그래서 세고 싶은 것은 첫 번째 매개 변수가 아닌 매개 변수의 수입니다. ( shift
변수 이름을 유지해야하기 때문에 사용할 수 없습니다 .) (음, 첫 줄 에 대해 물었다면 ...)
shift
.
-U를 추가하면 ls / wc 쌍을 사용하는 동안 훨씬 빠릅니다 (정렬하지 마십시오).
ls -AqU | wc -l
-U
그래도 GNU 전용입니다.
tree 명령을 설치 한 후 다음을 입력하십시오.
tree
숨겨진 파일도 원하는 경우 :
tree -a
Debian / Mint / Ubuntu Linux를 사용하는 경우 다음 명령을 입력하여 tree 명령을 설치하십시오.
sudo apt-get install tree
-L 옵션은 디렉토리 트리의 최대 표시 레벨을 지정하는 데 사용됩니다. tree 명령은 원하는 수의 디렉토리 트리 수준을 고려하여 파일 수뿐만 아니라 디렉토리 수도 계산합니다.
Gilles가 게시 한 라인을 따라 또 다른 기술이 있습니다 .
word_count () { local c=("$@"); echo "${#c[@]}"; }
file_count=$(word_count *)
13,923 개의 요소가있는 배열을 만듭니다 (파일이 많은 경우).
c
배열 의 요점은 무엇입니까 ? word_count() { echo "$#"; }
충분할 것입니다. @Gilles 솔루션의 요점은 명령 대체 (ksh93 이외의 쉘에 포크 및 파이프 포함)를 사용하지 않도록 카운트를 반환 변수에 저장하는 것입니다.
find . -type f -maxdepth 1 | wc -l
현재 디렉토리에있는 파일 만 나열 할 수 있습니다.
find . -type f
현재 디렉토리와 하위 디렉토리에서 재귀 적으로 파일을 찾습니다.
이전에 주어진 답변을 개선했지만 이번에는 명시 적으로 수행합니다.
$ tree -L 1 | tail -n 1 | cut -d " " -f 3
tail
and과 같은 사랑받는 명령의 사용을 주목할 가치가 있습니다 cut
. 또한 기본적으로 트리는 사용할 수 없습니다. 위의 명령은 먼저 레벨 1의 디렉토리에 대한 정보를 캡처 한 다음 tail -n 1
목표가 있는 마지막 줄 cut
을 가져 와서 세 번째 단어를 가져옵니다.
예를 들어 다음 위치에 있습니다 /
.
/ $ tree -L 1
.
├── 1
├── bin -> usr/bin
├── boot
├── dev
├── etc
├── home
├── lib -> usr/lib
├── lib64 -> usr/lib64
├── lost+found
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -> usr/sbin
├── srv
├── sys
├── tmp
├── usr
└── var
20 directories, 1 file
/ $ tree -L 1 | tail -n 1
20 directories, 1 file
/ $ tree -L 1 | tail -n 1 | cut -d " " -f 3
1
그렇다면 디렉토리 수를 묻는 것은 어떻습니까?
Linux에서 명령을 매우 강력하게 만들고 이름에 줄 바꿈이있는 파일을 처리하려면 다음을 사용하십시오.
find -maxdepth 1 -type f -print0 | tr -cd '\0' | wc -c
이것은 파싱 출력 의 시련 에서 우리를 구해줍니다 ls
.
관련 :
다음 tree
명령 만 사용하십시오 .
tree