파일 이름에 날짜 캡슐화

파일 이름에 날짜 캡슐화

날짜가 포함된 비디오 파일이 많이 있습니다. "filename1981.mkv"(기본적으로 "space+date+.")이고 날짜를 괄호로 묶고 싶습니다(예: "filename(1981).mkv").

  • 일부 파일에는 파일 이름에 연도가 포함되어 있고 일부 파일에는 포함되어 있지 않습니다.
  • 일부 파일에는 파일 이름에 추가 숫자가 포함되어 있습니다.
  • 일부 파일 이름이 (수동으로) 변경되었습니다.

나는 이것을 스스로 알아낼 만큼 bash에 능숙하지 않습니다. 도움을 주셔서 감사합니다!

답변1

이름을 바꾸려는 파일이 패턴과 일치한다고 가정합니다 *' '[0-9][0-9][0-9][0-9].mkv.

for name in *' '[0-9][0-9][0-9][0-9].mkv; do
    suffix=${name##* }        # remove all up to the last space of $name
    suffix=${suffix%.mkv}     # remove .mkv from end of $suffix
    suffix="($suffix).mkv"    # add parentheses and .mkv

    # Remove old suffix from $name by truncating
    # the name at the last space and then adding
    # the new suffix after a space, then rename
    # the original file.
    newname="${name% *} $suffix"

    printf '"%s" --> "%s"\n' "$name" "$newname"
    mv -- "$name" "$newname"
done

시험:

$ ls -1
filename 1980.mkv
filename 1981.mkv
filename 1982.mkv
filename 1983.mkv
filename 1984.mkv
filename 1985.mkv
script
$ sh script
"filename 1980.mkv" --> "filename (1980).mkv"
"filename 1981.mkv" --> "filename (1981).mkv"
"filename 1982.mkv" --> "filename (1982).mkv"
"filename 1983.mkv" --> "filename (1983).mkv"
"filename 1984.mkv" --> "filename (1984).mkv"
"filename 1985.mkv" --> "filename (1985).mkv"

스크립트는 이름 충돌을 처리하지 않습니다.


명령 rename(때때로 호출됨 prename)을 사용한 Perl 구현:

rename -v 's/(\d{4})\.mkv$/($1).mkv/' *.mkv

가지고 계시다면 참고해주세요다른일치하는 파일 *.mkv, PCRE가 (\d{4})\.mkv$일치하지 않기 때문에 이 명령은 파일 이름을 바꾸지 않습니다.

시험:

$ rename -v 's/(\d{4})\.mkv$/($1).mkv/' *.mkv
filename 1980.mkv renamed as filename (1980).mkv
filename 1981.mkv renamed as filename (1981).mkv
filename 1982.mkv renamed as filename (1982).mkv
filename 1983.mkv renamed as filename (1983).mkv
filename 1984.mkv renamed as filename (1984).mkv
filename 1985.mkv renamed as filename (1985).mkv

다시 실행해도 파일 이름이 바뀌지 않습니다.

$ rename -v 's/(\d{4})\.mkv$/($1).mkv/' *.mkv

(출력 없음)

답변2

zsh대신 사용하십시오 bash:

autoload -Uz zmv # best in ~/.zshrc
zmv -n '(**/)(* )(<1900-2021>)(.mkv)' '$1$2($3)$4'

만족스러우면 삭제 -n(테스트 실행)합니다.

해당 <1900-2021>범위의 십진수는 구성되는 자릿수에 관계없이 일치됩니다. 예를 들어, 일치하는 것을 원하지 않는 경우 00002000(파일 이름에서 이러한 일련의 숫자를 찾는 것이 가능함) (<1900-2021>)로 변경하여 4자로만 제한할 수 있습니다 (<1900-2021>~^????). 즉,~ 와는 별개로운영자와^ 아니요1 다음에 ????4개의 문자가 옵니다.

답변3

패턴이 항상 <space>dddd.mkv(d = 숫자)라고 가정하면 다음과 같이 할 수 있습니다.

파일 이름 예시

a 1986 filename 1981.mkv
filename 1981.mkv

암호:

for i in *.mkv; do
  echo "${i% [0-9.]*} (${i: -8:4}).mkv"
  # the below command will change the names
  # try with `echo` to check discrepancies in the file names
  # mv -- "$i" "${i% [0-9.]*} (${i: -8:4}).mkv"
done

a 1986 filename (1981).mkv
filename (1981).mkv

관련 정보