私は名前の変更が初めてで、パスカルケースを使用するファイルやフォルダが多く、これを小文字に変換してハイフンで区切りたいと思います。ファイルとフォルダに対してこのコマンドを再帰的に実行したいと思います。
例えば。
MyFile.txt
~になるmy-file.txt
MyPhoto.jpg
~になるmy-photo.jpg
しかし:
ABird.jpg
変わらずに維持しなければならないUSBDisk
変わらずに維持しなければならない- の場合、
MyUSBDisk
My-USBDiskまたはmy-USBDiskに満足しています。すべての大文字を小文字に変換する別のコマンドがあるため、その前に最も重要なのは、ハイフンを正しい場所に配置することです。
私の試みが失敗しました。
find /path/directory -depth -exec rename 's/\([A-Z]\)/-\L\$1/g' {} \;
それを処理する方法?私はLinux Mint 21を使用しています。
答え1
rename 's/\([A-Z]\)/-\L\$1/g'
いくつかあります。 Perl正規表現は、基本正規表現よりもPOSIX拡張正規表現に近く、リテラル角括弧と一致し、\(
グループ\)
化はバックスラッシュなしで行われます。また、右側のテキストをキャプチャされたグループに\$
します。この式は、最初の文字の大文字もキャプチャし、最初にダッシュを表示します。$
$1
次の内容になりますFooBar
(foo-bar
ここで名前が変更された部分のみ)。
rename 's/([[:lower:]])([[:upper:]])/$1-\L$2/g; s/^([[:upper:]])/\L$1/;' ...
しかしそれはまたUSBDisk.img
なるでしょうuSBDisk.img
。最初の文字の後に別の大文字がある場合は、置換を無効にするために負の予測チェックを追加できます。これは起こらないでしょうUSBDisk.img
。しかし、それでもそうDiskONE.img
ですdiskONE.img
。
rename 's/([[:lower:]])([[:upper:]])(?![[:upper:]])/$1-\L$2/g; s/^([[:upper:]])(?![[:upper:]])/\L$1/;' ...
または、ファイル名に2つの大文字が連続している場合は、プロセス全体をスキップします。
rename 'unless (/[[:upper:]]{2}/) { s/([[:lower:]])([[:upper:]])/$1-\L$2/g; s/^([[:upper:]])/\L$1/ }' ...
rename -n -v
変更を適用せずに最初にテストして変更を確認できます。
もちろん、これはまだFoo-Bar.jpg
結果が出るfoo-Bar.jpg
でしょうが、今は練習で修正します...
rename
run を使用するには、find
適切な-exec
構文を追加する必要があります。
find /path/directory -depth -exec rename '...' {} \;
または、-exec {} +
一度に複数のファイル名を指定して使用してください。rename
find /path/directory -depth -exec rename '...' {} +
Stéphaneが述べたように、名前変更をファイル名部分に限定したい場合があります。 .(非標準、GNU / BSD)の代わりに-d
オプションを追加またはrename
切り替えます。-execdir
-exec
答え2
そしてzsh
:
autoload -Uz zmv
zmv -n '(**/)(*[[:lower:]][[:upper:]]*~*[[:upper:]](#c2)*)' \
'$1${${2//(#b)([[:lower:]])([[:upper:]])/$match[1]-$match[2]}:l}'
<lower><upper>
シーケンスが1つ以上あるがシーケンスを持たないファイルの名前を変更し、小文字<upper><upper>
と大文字の間にを挿入し、ファイル全体を小文字に変換します。-
(-n
テストの実行のためにここに)。