특정 확장자를 가진 특정 디렉토리의 총 파일 수 계산


32

".mp4"확장자로 끝나는 특정 디렉토리의 총 파일 수를 계산하고 싶습니다.

다음 명령을 받고 있습니다.

ls -F |grep -v / | wc -l

특정 디렉토리의 모든 파일을 계산하지만 확장자가 .mp4 인 파일 수를 원합니다.

그것에 대한 우분투 명령이 있습니까?


2
간단하고 정확한 대답은 @ louis-matthijssen입니다. ls -1이 경우, 개행 문자를 처리하면 ls출력 을 구문 분석 할 수 있습니다. 표시된 것은 -R 플래그 사용에 잘못되었습니다.
Rmano

답변:


19

여기서 당신은 이런 식으로 할 수 있습니다

ls -lR /path/to/dir/*.jpg | wc -l

이것은 당신에게 계산을 제공합니다


5
-R? stat파일 이름 만 필요할 때 전체를 사용하는 이유는 무엇 입니까? 왜 안돼 ls -1 *.jpg| wc -l? (확인, 개행 문자가 포함 된 파일 이름이 있으면 작동하지 않습니다.이 경우 자격이 있습니다 ;-) ...)
Rmano

2
... 그리고 질문은 "디렉토리의 파일 수를 세는 것"이었습니다. 또한 하위 디렉토리의 파일이 아닌 .jpg로 끝나는 하위 디렉토리의 모든 내용 을 재귀 적으로 나열합니다 . 테스트 해 본 적이 있습니까? .jpg
Rmano

1
질문은 "특정 디렉토리의 파일"이라고 말하는데, 이는 하위 디렉토리 재귀가 필요하지 않음을 의미합니다.
David Richerby

1
디렉토리에 파일이 너무 많으면 ( *.jpg가 아니라 셸로 확장 되기 때문에 ls) 이름이 하이픈으로 시작하는 파일이있는 경우에도 실패합니다 .
David Richerby

2
@DavidRicherby로 시작하는 이름을 건너 뜁니다 .. 그러나 실제로 /path/to/dir빈 문자열 또는 하이픈으로 시작하는 상대 경로가 아닌 경우를 제외하고 이름에 하이픈 이 있으면 정상적으로 작동합니다. 그러나 나는ls 문자를로 대체 한다고 말한 적이 잘못 되었습니다 ?. stdout이 터미널 일 때 발생하지만 출력은 파이프이므로 ls모든 문자를 파일 이름에서로 보냅니다 wc. 파일 이름에 줄 바꿈이 포함될 수 있기 때문에 동작을 변경하기 위해 -q또는 -b플래그가 없으면이 답변이 잘못됩니다 . l0b0의 대답 에는 이러한 문제가 없습니다.
Eliah Kagan

42

불행히도이 양성 문제는 모든 파일 이름을 지원하고 이식 가능한 방식으로 해결하기 어렵습니다. 이것은 안전합니다 (숨겨진 파일, 공백을 포함하는 경로, 대시 및 줄 바꿈 처리) 및 POSIX 호환 :

find /path/to/directory -mindepth 1 -type f -name "*.mp4" -printf x | wc -c

재귀 적이기를 원하지 않으면 간단히 추가하십시오 -maxdepth 1.

ls출력을 구문 분석해서는 안됩니다 .

테스트:

$ cd -- "$(mktemp -d)"
$ touch -- -foo.mp4 .bar.mp4 .bat.mp4 'baz.mp4
> ban.mp4'
$ find . -mindepth 1 -type f -name "*.mp4" -exec printf x \; | wc -c
4

허용 된 답변 과 비교하십시오 .

$ ls -lR ./*.mp4 | wc -l
3

또는 다른 제안 :

$ find . -name "*.mp4" | wc -l
5
$ ls -1 *.mp4 | wc -l
ls: invalid option -- '.'
Try 'ls --help' for more information.
0
$ find . -name "*.mp4" | wc -c # Answer fixed at a later time
51
$ find . -name "*.mp4" | wc -l
5
$ find . | grep -i ".mp4$" | wc -l
5
$ ls . | grep ".mp4$" | wc -l
3

2
이 답변은 정확하고 강력하지만 -printf x대신 사용할 수 있습니다 -exec printf x \;. 즉 : find /path/to/directory -mindepth 1 -type f -name "*.mp4" -printf x | wc -c 할 필요가 없습니다 -exec외부 printf많은 파일이있을 것입니다있을 경우 명령, 아주 느린가 있기 때문 find에이 포크 (2) 다음 자신의 복사본 해제 및 (2)에서 execve /usr/bin/printf . 를 사용하면 각 파일마다-exec printf x \; 한 번씩 수행해야 합니다 .
Eliah Kagan

-printfPOSIXfind 에서 지원 되지 않으므로 사용하지 않았습니다.
l0b0

1
-mindepth-maxdepth님도 사용 하지 않았습니다 .
Eliah Kagan

좋은 지적은, 나는 그것을 집어 들지 않았다!
l0b0

BSD find에는 포함 -mindepth되어 -maxdepth있지만 포함 -printf되어 있지 않으므로 둘 다 포함하는 것이 좋습니다.
Joseph

11

이것은 확장명으로 모든 파일을 순서대로 찾고 정렬하고 나열합니다.

find . -type f | sed 's/.*\.//' | sort | uniq -c

우수한! 난 그냥 | sort -rn끝에 추가 하고 어쩌면 -mindepth 1현재 디렉토리입니다.
Pablo A

그리고 아마도 head -nn을 얻기 위해 파이프를 연결하십시오.
Raman

감사합니다
Dennis Golomazov

5

다음 명령으로 매우 간단하다고 생각합니다.

$ find . -name "*.mp4" | wc -l
8

또는

$ find . | grep -i ".mp4$" | wc -l
8

위의 명령은 파일 및 디렉토리 이름의 수를 계산한다고 생각합니다. *.mp4

-type f옵션 find을 다음과 같이 매개 변수로 사용하는 것이 좋습니다 .

$ find . -name "*.mp4" -type f | wc -l
8

또한 ls -lR사용할 수 있습니다find .


2

사용할 수 있습니다 ls -1 *.mp4 | wc -l.

그러면에 끝나는 모든 파일이 나열되고 .mp4각 파일을 새 줄 ( ls -1 *.mp4) 에 인쇄 wc하고 -l플래그를 사용하여 새 줄 수를 세는 출력을 파이프합니다 .


이것이 다운 보트 된 이유를 잘 모르겠습니다.
Panther

*.mp4ls이 아닌 확장되어 있기 때문에 .mp4디렉토리에 파일 이 너무 많아서 목록 ls으로 인수 로 전달할 수없는 경우 실패합니다 .
David Richerby

@Rmana--.mp4
David Richerby

@DavidRicherby 네, 맞습니다. --두 번째 경우를 해결합니다. 전자는 오류 메시지 (많은 파일이 필요합니다!)와 또 다른 멋진 질문이 생길 것입니다. 코너 케이스이지만 주목할 가치가 있습니다.
Rmano

1
@Rmano은 추가하지 않고 -q또는 -b,이 않습니다 없는 파일 이름에 줄 바꿈을 허용. ls -1 *.mp4파이프가없는 터미널에서 실행 하는 경우 stdout 이 터미널이며 암시 적으로 인쇄 되는 ls것으로 간주합니다 . 그러나 출력이 파이프되면 해당 동작이 사라집니다. 줄 바꿈이 있으면 초과합니다. "보는 것 "을 보여줍니다 . ( stdout 터미널 이 아닌 경우에는 암시 적이므로 선택 사항입니다.) 거의 작동하지만 .mp4 파일은 0이 아닙니다. -q?ls -1 *.mp4 | wc -lls -1 *.mp4 | catwc-1ls -1q -- *.mp4 | wc -l
Eliah Kagan

0

.mp4가 포함 된 파일 목록이 표시됩니다.

ls /path/to/directory | grep ".mp4$"

와 결합 wc -l하면 계산할 수 있습니다

ls /path/to/directory | grep ".mp4$" | wc -l

하위 디렉토리를 포함하도록 검색하려는 경우

ls -lR /path/to/directory | grep ".mp4$" | wc -l

카운트를 제공하지 않습니다
Panther

함께 사용할 때 나에게 준wc -l
Back.Slash

배관없이 ls를 사용하여 grep하고 답을 줄이십시오. 지금 적어도 두 번 게시되었습니다.
Panther

@ bodhi.zazen ls /directory/*.mp4은 쉘이 glob를 확장하고 다음과 같은 것을 실행 ls /directory/file1.mp4 /directory/file2.mp4 ...하게합니다 ls.
David Richerby

@DavidRicherby-그것은 내 ls 명령이 아니며, find;를 사용합니다)
Panther


0
ls | grep --count \.csv$

바꾸기 (.csv를 원하는 확장자로)

설명 : 간단한 구성표는 파일 목록을 가져오고 grep으로 확장자를 계산하는 것입니다. 줄 끝에서 확장 과 \.일치 .하고 $일치시킵니다. ls의 출력이 파이프 될 때 한 줄에 하나의 파일 이름이 전송되므로 다음을 실행하여 확인할 수 있기 때문에 작동합니다.

ls | cat

1
대신에을 grep --count사용할 수도 있습니다 grep -c.
모신 라자

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.