찾기: 이름 패턴에 와일드카드 문자 사용

찾기: 이름 패턴에 와일드카드 문자 사용

비디오를 재생하기 위한 간단한 래퍼 스크립트가 있습니다. 여기서 내 스크립트는 주어진 비디오 파일에 대한 자막 파일(있는 경우)을 찾으려고 시도합니다. 비디오 이름이 주어지면 .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.vttfoo.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 호환.)

관련 정보