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