"find" 명령 구문 분석

"find" 명령 구문 분석

다음 명령은 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")이 포함됩니다.printprintf

| 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
}

관련 정보