다음 명령은 mp4 비디오 파일의 길이를 알려줍니다.
find -type f -name "*.mp4" -print0 | \
xargs -0 mplayer -vo dummy -ao dummy -identify 2>/dev/null | \
perl -nle '/ID_LENGTH=([0-9\.]+)/ && ($t +=$1) && printf "%02d:%02d:%02d\n",$t/3600,$t/60%60,$t%60' | \
tail -n 1
누군가 그것을 분석하고 왜 이런지 설명할 수 있습니까?
다시 입력하거나 복사하여 붙여넣을 필요 없이 계속해서 사용할 수 있는 방법을 알아두면 도움이 될 것입니다.
답변1
find -type f -name "*.mp4" -print0
현재 디렉터리에서 이름이 로 끝나는 일반 파일을 반복적으로 검색하고 .mp4
해당 상대 경로 이름을 null 바이트로 구분하여 인쇄합니다. 개행은 파일 이름에서 유효한 문자이므로 -print0
여기보다 안전합니다 .-print
찾기(1)
| xargs -0
입력을 다음 명령에 대한 인수로 사용합니다. 입력은 널로 구분됩니다.xargs(1)
mplayer -vo dummy -ao dummy -identify 2>/dev/null
이것이 실행되는 명령입니다 xargs
. 가상 비디오 및 오디오 드라이버를 사용하여 쉽게 구문 분석할 수 있는 형식으로 파일 매개변수를 표시합니다. STDERR의 모든 출력을 삭제합니다.플레이어(1)
| perl -nle
출력을 Perl로 파이프합니다. Perl은 입력 줄을 변수로 읽어서 $_
끝에서 개행 문자를 제거합니다.페렌(1)
/ID_LENGTH=([0-9\.]+)/
줄이 이 정규식과 일치하면 "ID_LENGTH=" 뒤의 숫자를 캡처하세요.
&& ($t +=$1)
$t
그런 다음 첫 번째 게임에서 잡은 숫자 만큼 변수를 증가시키고 ,
&& printf "%02d:%02d:%02d\n",$t/3600,$t/60%60,$t%60'
그리고 그로부터 시간, 분, 초를 계산합니다 $t
. 이는 초 수입니다. Perl 호출에서는 자동으로 줄 바꿈 이 명령문 -l
에 추가되지만 줄 바꿈은 추가 되지 않으므로 형식 문자열에 ("\n")이 포함됩니다.print
printf
| tail -n 1
출력의 마지막 줄만 인쇄됩니다.꼬리(1)
이 파이프를 단일 명령으로 만들려면 셸 .bashrc
이나 셸에서 사용하는 rc 파일에 셸 함수를 만들 수 있습니다. 예는 다음과 같습니다.
vid_lengths() {
find -type f -name "*.mp4" -print0 \
| xargs -0 mplayer -vo dummy -ao dummy -identify 2>/dev/null \
| perl -nle '/ID_LENGTH=([0-9\.]+)/ && ($t +=$1) && printf "%02d:%02d:%02d\n",$t/3600,$t/60%60,$t%60' \
| tail -n 1
}