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.mp4
to 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
공백이 삽입되므로 위와 작동하지 않습니다.n
A
A
T
A
소비됨이전 대체를 전달합니다.
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를 설치하는 것이 과감한 접근 방식이라는 것을 알고 있지만 어려운 문자(예: 공백)가 포함된 파일 이름을 쉽게 처리할 수 있다는 점을 지적하고 싶습니다.