".mp4"확장자로 끝나는 특정 디렉토리의 총 파일 수를 계산하고 싶습니다.
다음 명령을 받고 있습니다.
ls -F |grep -v / | wc -l
특정 디렉토리의 모든 파일을 계산하지만 확장자가 .mp4 인 파일 수를 원합니다.
그것에 대한 우분투 명령이 있습니까?
".mp4"확장자로 끝나는 특정 디렉토리의 총 파일 수를 계산하고 싶습니다.
다음 명령을 받고 있습니다.
ls -F |grep -v / | wc -l
특정 디렉토리의 모든 파일을 계산하지만 확장자가 .mp4 인 파일 수를 원합니다.
그것에 대한 우분투 명령이 있습니까?
답변:
여기서 당신은 이런 식으로 할 수 있습니다
ls -lR /path/to/dir/*.jpg | wc -l
이것은 당신에게 계산을 제공합니다
-R
? stat
파일 이름 만 필요할 때 전체를 사용하는 이유는 무엇 입니까? 왜 안돼 ls -1 *.jpg| wc -l
? (확인, 개행 문자가 포함 된 파일 이름이 있으면 작동하지 않습니다.이 경우 자격이 있습니다 ;-) ...)
.jpg
*.jpg
가 아니라 셸로 확장 되기 때문에 ls
) 이름이 하이픈으로 시작하는 파일이있는 경우에도 실패합니다 .
.
. 그러나 실제로 /path/to/dir
빈 문자열 또는 하이픈으로 시작하는 상대 경로가 아닌 경우를 제외하고 이름에 하이픈 이 있으면 정상적으로 작동합니다. 그러나 나는ls
문자를로 대체 한다고 말한 적이 잘못 되었습니다 ?
. stdout이 터미널 일 때 발생하지만 출력은 파이프이므로 ls
모든 문자를 파일 이름에서로 보냅니다 wc
. 파일 이름에 줄 바꿈이 포함될 수 있기 때문에 동작을 변경하기 위해 -q
또는 -b
플래그가 없으면이 답변이 잘못됩니다 . l0b0의 대답 에는 이러한 문제가 없습니다.
불행히도이 양성 문제는 모든 파일 이름을 지원하고 이식 가능한 방식으로 해결하기 어렵습니다. 이것은 안전합니다 (숨겨진 파일, 공백을 포함하는 경로, 대시 및 줄 바꿈 처리) 및 POSIX 호환 :
find /path/to/directory -mindepth 1 -type f -name "*.mp4" -printf x | wc -c
재귀 적이기를 원하지 않으면 간단히 추가하십시오 -maxdepth 1
.
테스트:
$ 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
-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 \;
한 번씩 수행해야 합니다 .
-printf
POSIXfind
에서 지원 되지 않으므로 사용하지 않았습니다.
-mindepth
및 -maxdepth
님도 사용 하지 않았습니다 .
find
에는 포함 -mindepth
되어 -maxdepth
있지만 포함 -printf
되어 있지 않으므로 둘 다 포함하는 것이 좋습니다.
이것은 확장명으로 모든 파일을 순서대로 찾고 정렬하고 나열합니다.
find . -type f | sed 's/.*\.//' | sort | uniq -c
| sort -rn
끝에 추가 하고 어쩌면 -mindepth 1
현재 디렉토리입니다.
head -n
n을 얻기 위해 파이프를 연결하십시오.
사용할 수 있습니다 ls -1 *.mp4 | wc -l
.
그러면에 끝나는 모든 파일이 나열되고 .mp4
각 파일을 새 줄 ( ls -1 *.mp4
) 에 인쇄 wc
하고 -l
플래그를 사용하여 새 줄 수를 세는 출력을 파이프합니다 .
*.mp4
셸 ls
이 아닌 확장되어 있기 때문에 .mp4
디렉토리에 파일 이 너무 많아서 목록 ls
으로 인수 로 전달할 수없는 경우 실패합니다 .
--.mp4
--
두 번째 경우를 해결합니다. 전자는 오류 메시지 (많은 파일이 필요합니다!)와 또 다른 멋진 질문이 생길 것입니다. 코너 케이스이지만 주목할 가치가 있습니다.
-q
또는 -b
,이 않습니다 없는 파일 이름에 줄 바꿈을 허용. ls -1 *.mp4
파이프가없는 터미널에서 실행 하는 경우 stdout 이 터미널이며 암시 적으로 인쇄 되는 ls
것으로 간주합니다 . 그러나 출력이 파이프되면 해당 동작이 사라집니다. 줄 바꿈이 있으면 초과합니다. "보는 것 "을 보여줍니다 . ( stdout 이 터미널 이 아닌 경우에는 암시 적이므로 선택 사항입니다.) 거의 작동하지만 .mp4 파일은 0이 아닙니다. -q
?
ls -1 *.mp4 | wc -l
ls -1 *.mp4 | cat
wc
-1
ls -1q -- *.mp4 | wc -l
.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
wc -l
ls /directory/*.mp4
은 쉘이 glob를 확장하고 다음과 같은 것을 실행 ls /directory/file1.mp4 /directory/file2.mp4 ...
하게합니다 ls
.
bash에서 glob가있는 배열을 사용하는 한 가지 차가운 방법은 다음과 같습니다.
$ files=( *.mp4 )
$ echo ${#files[@]}
30
리눅스에서 확장자로 파일을 계산하는 방법을 확인 ? 좋은 답변과 설명을 제공하며 다음 명령을 사용할 수 있습니다.
find . -type f | sed -n 's/..*\.//p' | sort | uniq -c
ls -1
이 경우, 개행 문자를 처리하면ls
출력 을 구문 분석 할 수 있습니다. 표시된 것은 -R 플래그 사용에 잘못되었습니다.