비디오를 재생하기 위한 간단한 래퍼 스크립트가 있습니다. 여기서 내 스크립트는 주어진 비디오 파일에 대한 자막 파일(있는 경우)을 찾으려고 시도합니다. 비디오 이름이 주어지면 .vtt
비디오 형식 확장자 대신 확장자로 끝나는 동일한 이름을 찾고 있습니다 .
#!/bin/sh
video_file="$1"
sub_file="$(/bin/find -name ${video_file%.*}.*.vtt)"
if [ -f "$sub_file" ] ; then
echo "subtitles found: $sub_file"
else
echo "subtitles not found"
fi
하위 파일이 여러 개 있는 경우(예: foo.en.vtt
, foo.de.vtt
, 첫 번째로 발견된 하위 파일을 사용하고 싶습니다.)
문제는 위 스크립트가 .vtt
일치하는 파일이 0개 또는 1개 있는 경우에만 작동한다는 것입니다. 두 개가 있는 경우 find
다음 오류가 반환됩니다.
/bin/find: paths must precede expression: `2207-_-20220620.en.vtt'
/bin/find: possible unquoted pattern after predicate `-name'?
subtitles not found
-name
문제는 find가 술어에 대해 두 개의 매개변수를 얻는다는 것입니다 . 하지만 패턴을 인용할 수는 없습니다. ${video_file%.*}.*.vtt
왜냐하면 와일드카드가 *
문자 그대로 해석되기 때문입니다.
술어를 사용해 보았지만 -regex
동일한 결과를 얻었습니다.
스크립트에서 원하는 효과를 어떻게 얻을 수 있나요?
답변1
당신은 썼다,
하지만 패턴을 인용할 수는 없습니다.
${video_file%.*}.*.vtt
왜냐하면 와일드카드가*
문자 그대로 해석되기 때문입니다.
내 생각엔 이것이 바로 이 경우에 해야 할 일이라고 생각한다. 이 필드를 인용하면 쉘이 이를 glob으로 적용하는 것을 방지하지만 find
파일 이름 패턴에서 와일드카드 문자를 볼 수 있습니다. ( find -name
와일드카드 패턴 자체를 이해하세요. 자세한 내용 man find
은 설명을 확인하고 검색하세요 -name
.)
귀하의 질문에 설명된 대로 비디오 파일이 foo.mp4
두 개의 자막 파일 foo.de.vtt
과 foo.en.vtt
.
이 코드 조각을 사용하여 두 가지를 모두 식별할 수 있습니다.
video=foo.mp4
find . -name "${video_file%.*}.*.vtt" -print
이 출력
./foo.de.vtt
./foo.en.vtt
첫 번째 확장만 원한다고 하셨으므로 POSIX가 아닌 확장을 사용하면 -quit
첫 번째 확장만 얻을 수 있습니다.
subtitles=$(find -name "${video_file%.*}.*.vtt" -print -quit)
echo "> $subtitles"
> ./foo.de.vtt
find
검색은 디렉터리 순서대로 이루어지므로 결과가 반드시 정렬된 순서로 반환되는 것은 아닙니다 . 일치하는 파일 이름에 개행 문자가 포함되지 않는다고 보장할 수 있는 경우 find … -print | sort | head -n1
현재 로케일을 기준으로 정렬할 수 있습니다. (그럼 역시POSIX 호환.)