확장자가 다른 2개의 유사한 파일 이름을 첫 번째 파일과 바꾸되 확장자는 유지합니다.

확장자가 다른 2개의 유사한 파일 이름을 첫 번째 파일과 바꾸되 확장자는 유지합니다.

동일한 디렉터리에 여러 세트의 .m4v 및 .srt 파일이 있지만 이름은 처음 3자만 일치합니다. 해당 .m4v 파일과 일치하도록 .srt 파일의 이름을 어떻게 바꿀 수 있습니까(물론 .srt 확장자는 유지하면서)?

여기에 이미지 설명을 입력하세요.

답변1

.m4v쉘 변수에 이름이 주어지면 name첫 번째 공백을 자르고 파일 이름 접미사를 추가하여 해당 파일의 이름을 얻습니다..srt$name.srt

이것은 으로 이루어집니다 ${name%% *}.srt. 이렇게 하면 일치하는 가장 긴 접미사 문자열이 제거되어 *결과 끝에 $name추가됩니다 ..srt

파일의 새 이름 .srt은 이지만 $name파일 .m4v이름 접미사는 으로 변경됩니다 .srt.

이것은 으로 이루어집니다 ${name%.m4v}.srt. 그러면 일치하는 .m4v(가장 짧은) 접미사 문자열이 제거되어 결과 끝에 $name 추가됩니다 ..srt

.srt다음은 위의 두 매개변수 대체를 사용하여 현재 디렉터리에 있는 파일 목록이 주어지면 각 파일의 이름을 바꾸는 루프입니다 . .mv4또한 루프는 .m4v해당 .srt파일 없이 파일이 존재하는지 또는 파일의 새 이름이 .srt이미 존재하는지 여부를 알려줍니다.

for name in *.m4v; do
    if [ ! -e "${name%% *}.srt" ]; then
        printf 'Can not find .srt file for "%s"\n' "$name"
        continue
    elif [ -e "${name%.m4v}.srt" ]; then
        printf '.srt file for "%s" already exists\n' "$name"
        continue
    fi >&2

    mv -- "${name%% *}.srt" "${name%.m4v}.srt"
done

답변2

존재하다 zsh:

for f (???.srt) () {
  (( $# == 1 )) && mv -- $f $1:r.srt
} $f[1,3]?*.m4v(NY2)

이러한 m4v 파일이 있을 때마다 ???.srt파일 이름이 바뀌고 동일한 접두어 3자를 붙인 파일의 oot 이름이 복사됩니다 r.m4v

관련 정보