TitleCase -> Title Case [닫기]에서 파일 이름 일괄 변경(공백으로 구분)

TitleCase -> Title Case [닫기]에서 파일 이름 일괄 변경(공백으로 구분)

800개의 MP4 비디오가 들어 있는 38GB 폴더가 있습니다. 다시 다운로드하면 파일 이름이간격 없음, 모든 단어는 연결되지만 여전히 TitleCase입니다.

그래서 TitleCase내가 필요한 것에서 Title Case.

이러한 파일의 이름을 일괄적으로 바꾸는 가장 효율적인 방법은 무엇입니까?

rename내 배포판에 포함되었거나 오래 전이었던 것으로 기억 하지만 더 이상 존재하지 않는 것 같습니다.autorename

답변1

mp4 파일 이름 TitleCase의 각 "단어" 사이에 공백을 추가하려는 경우(PascalCase에서 공백으로 구분된 단어):

rename -n 's/\B[[:upper:]]/ $&/g' ./*.mp4

산출

rename(./FooBarBaz.mp4, ./Foo Bar Baz.mp4)

Perl을 자세히 다루는 이 기사를 확인하십시오.rename

다른 버전과 용도의 이름을 바꾸는 것은 어떻습니까? Perl 버전을 사용하는 데 특별히 권장되는 방법은 무엇입니까?

답변2

가장 효율적인 방법이 무엇인지는 모르겠지만(효율적이라는 뜻인 것 같습니다) 다음과 같은 for 루프를 빠르게 작성하겠습니다.

for file in *.mp4; do
  newname="$(echo "$file" | sed 's/\(.\)\([A-Z]\)/\1 \2/g')"
  mv "${file}" "${newname}"
done

설명하다:

  newname="$(echo "$file" | sed 's/\(.\)\([A-Z]\)/\1 \2/g')"
#        ^-------------------- Assign to  variable "newname" value…
#         ^------------------- "$()": as output by commannd in parentheses;
#                              use "" to avoid word splitting

어디

echo $file | sed 's/\(.\)\([A-Z]\)/\1 \2/g'
#    ^-------------------------------------- output old file name
#          ^-------------------------------- pipe to `sed` command

sed"스트림 편집기"의 이름입니다. 입력을 받아들이고 명령을 실행하며 출력을 생성합니다. 여기에 있는 명령은 s검색 및 바꾸기에 표시된 것과 같습니다.

s/\(.\)\([A-Z]\)/\1 \2/g
^^ ^  ^ ^      ^ ^  ^  ^
|| |^ | | ^^^  | |  |  |
\------------------------ s: search and replace
 \----------------------- /: Set the search;replace;flags separator to "/"
   || | | \|/  | \  /  |
   \--+------------------ \(…\): a "capture group" (the first one);
    |   |  |   |  ||   |         whatever is matches the content will be
    |   |  |   |  \|   |         available as \1
    \-------------------- .: We match ".", which means *any* character
        |  |   |   |   |  (which precludes this from matching at start of line)
        \------+--------- \(…\): Second capture group, \2
           \------------- [A-Z]: Match any capital letter
                   |   |
                   \----- Replacement: "\1 \2" replace
                       |  "characterbeforecapitalletter""Capitalletter" with
                       |  "characterbeforecapitalletter" "Capitalletter"
                       |
                       \- g: Flag that means "global": Repeat this until
                             end of line

답변3

FooBarBaz.mp4to be 와 같은 제목 케이스에서 단어를 분리하려면 Foo Bar Baz.mp4파일 이름의 첫 번째 문자가 아닌 한 각 대문자 앞에 공백을 삽입할 수 있습니다. zsh를 사용하면 zmv다음을 (재귀적으로) 수행할 수 있습니다.

$ autoload -Uz zmv
$ zmv -n '(**/)(?)(*.mp4)' '$1$2${3//(#m)[[:upper:]]/ $MATCH}'
mv -- FooBarBaz.mp4 'Foo Bar Baz.mp4'
mv -- OnceUponATime.mp4 'Once Upon A Time.mp4'

( -n원하는 경우 시험 실행을 위해 제거).

Foo-Bar.mp4그것이 어떻게 되는지 조심하세요 Foo- Bar.mp4.

zmv -n '(**/)(*.mp4)' '$1${2//(#b)([[:alpha:]])([[:upper:]])/$match[1] $match[2]}'

문자와 대문자 사이에만 공백을 삽입하지만 이미 있는 것처럼 및 사이가 아닌 및 사이에 OnceUponATime공백이 삽입되므로 위와 작동하지 않습니다.nAATA소비됨이전 대체를 전달합니다.

zsh glob에는 Perl의 둘러보기 연산자와 동등한 것이 없기 때문에 이 문제를 해결하는 것이 더 어렵습니다. 이 경우 간단한 접근 방식은 대체를 한 번 더 반복하는 것입니다.

$ zmv -n '(**/)(*.mp4)' '$1${${2//(#b)([[:alpha:]])([[:upper:]])/$match[1] $match[2]}//(#b)([[:alpha:]])([[:upper:]])/$match[1] $match[2]}'
mv -- ABCDEF.mp4 'A B C D E F.mp4'
mv -- AChristmasCarol.mp4 'A Christmas Carol.mp4'
mv -- FooBarBaz.mp4 'Foo Bar Baz.mp4'
mv -- LeSongeD\'UneNuitD\'Été.mp4 'Le Songe D'\''Une Nuit D'\'Été.mp4
mv -- LifeOfΠ.mp4 'Life Of Π.mp4'
mv -- OnceUponATime.mp4 'Once Upon A Time.mp4'

답변4

다른 답변은 좋은 접근 방식인 정규식을 기반으로 변경을 허용하는 도구를 설명합니다. 그러나 이러한 답변은 중요한 문제(IMHO)를 해결하지 못합니다. 즉, 실제로 디스크를 변경하기 전에 기능을 미리 보는 것(되돌리기 어려울 수 있음)입니다.

dired특히 wdired문서에 설명된 Emacs 및 해당 모드를 입력하세요.수동. 파일이 포함된 디렉터리의 디렉터리를 열고, 파일 이름을 편집할 수 있도록 wdired를 전환하고, 변경 작업을 수행할 수 있습니다. 대부분 대화형 정규식 검색 및 바꾸기를 사용하여 변경 사항을 확인하고, 마지막으로 디스크에 커밋합니다.

이 사용 사례에 대해 Emacs를 설치하는 것이 과감한 접근 방식이라는 것을 알고 있지만 어려운 문자(예: 공백)가 포함된 파일 이름을 쉽게 처리할 수 있다는 점을 지적하고 싶습니다.

관련 정보