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をインストールすることは大胆なアプローチであることを知っていますが、難しい文字(スペースなど)を含むファイル名を簡単に処理できることを指摘したいと思います。

関連情報