파일 수가 많은 디렉토리가 있습니다. 카운트를 제공하는 ls
스위치가 표시되지 않습니다. 파일 수를 얻는 명령 줄 마술이 있습니까?
"파일"의 광범위한 정의 사용
ls | wc -l
숨겨진 파일은 계산하지 않으며 파일 이름에 줄 바꿈 문자가 포함되지 않는다고 가정합니다.
숨겨진 파일을 포함 시키려면 (.
및 ..
) 개행 문자 문제를 피하십시오. 일반적인 방법은 다음과 같습니다.
find . ! -name . -Prune -print | grep -c /
또는 재귀 적으로 :
find .//. ! -name . -print | grep -c //
파일의 좁은 정의 :
find . -maxdepth 1 -type f | 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-<number-one> | 화장실-<letter-l>
du --inodes
가 유용하다는 것을 알았지 만 어떤 버전의 du
이 (가) 필요한지 확실하지 않습니다. find
및 wc
를 사용하는 대체 방법보다 훨씬 빠릅니다.
우분투 17.10에서는 다음이 작동합니다.
du --inodes # all files and subdirectories
du --inodes -s # summary
du --inodes -d 2 # depth 2 at most
포함하는 inode 수를 기준으로 내림차순으로 정렬하려면 | sort -nr
와 결합하십시오.
아마도 ls
/wc
pair를 사용하는 가장 완전한 답은
ls -Aq | wc -l
도트 파일을 세고 싶다면
ls -q | wc -l
그렇지 않으면.
-A
는 도트 파일을 세지 만 .
및 ..
는 생략합니다.-q
make ls
그래픽이 아닌 문자, 특히 개행 문자를 ?
로 바꾸어 각 파일에 대해 출력을 한 줄로 만듭니다.터미널의 ls
에서 한 줄 출력을 얻으려면 (즉, wc
로 파이프하지 않고) -1
옵션을 추가해야합니다.
(ls
의 동작은 coreutils 8.23으로 테스트되었습니다)
현재 디렉토리에 숨겨지지 않은 파일이 하나 이상 포함되어있는 경우 :
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
에 전달하는 솔루션 중 하나가 인수 목록이 너무 깁니다 오류와 함께 실패 할 수 있습니다.
-U를 추가하면 ls/wc 쌍을 사용하는 동안 훨씬 빠릅니다 (정렬하지 마십시오).
ls -AqU | wc -l
Tree 명령을 설치 한 후 다음을 입력하십시오.
tree
숨겨진 파일도 원하는 경우 :
tree -a
Debian/Mint/Ubuntu Linux를 사용하는 경우 다음 명령을 입력하여 tree 명령을 설치하십시오.
Sudo apt-get install tree
-L 옵션은 디렉토리 트리의 최대 표시 레벨을 지정하는 데 사용됩니다. tree 명령은 원하는 수의 디렉토리 트리 수준을 고려하여 파일 수뿐만 아니라 디렉토리 수도 계산합니다.
find -maxdepth 1 -type f -printf . | wc -c
-maxdepth 1
는 비재 귀적이며, find
는 기본적으로 재귀 적입니다.-type f
는 파일 만 포함합니다-printf .
는 귀여운 터치입니다. 파일 이름 대신 각 파일에 대해 점을 인쇄합니다. 이제 파일 이름을 처리하고 데이터를 저장할 수 있습니다. 우리는 단지 점을 세어야합니다 :)| wc -c
문자 수파이프 없음, 문자열 사본 없음, 포크 없음, 일반 bash 하나의 라이너
$ fcount() { local f i=0; for f in *; do let i++; done; echo $i; }; fcount
Linux에서 명령을 매우 강력하게 만들고 이름에 줄 바꿈이있는 파일을 처리하려면 다음을 사용하십시오.
find -maxdepth 1 -type f -print0 | tr -cd '\0' | wc -c
이렇게하면 구문 분석 ls
출력의 ordeal 에서 벗어날 수 있습니다.
관련 :
다음은 한 Gilles 게시 라인에 따른 또 다른 기술입니다.
Word_count () { local c=("$@"); echo "${#c[@]}"; }
file_count=$(Word_count *)
13,923 개의 요소가있는 배열을 만듭니다 (파일이 많은 경우).
find . -type f -maxdepth 1 | wc -l
현재 디렉토리에있는 파일 만 나열 할 수 있습니다.
이전에 제공된 답변을 개선했지만 이번에는 명시 적으로 수행합니다.
$ tree -L 1 | tail -n 1 | cut -d " " -f 3
tail
및 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
그렇다면 디렉토리 수를 묻는 것은 어떻습니까?
이것을 시도해보십시오.이 답변이 도움이되기를 바랍니다.
echo $((`ls -l | wc -l` -1 ))
당신은 확인할 수 있습니다 :
ls -l | grep -v ^l | wc -l