PascalCaseを小文字のハイフンに変換

PascalCaseを小文字のハイフンに変換

私は名前の変更が初めてで、パスカルケースを使用するファイルやフォルダが多く、これを小文字に変換してハイフンで区切りたいと思います。ファイルとフォルダに対してこのコマンドを再帰的に実行したいと思います。

例えば。

  • MyFile.txt~になるmy-file.txt
  • MyPhoto.jpg~になるmy-photo.jpg

しかし:

  • ABird.jpg変わらずに維持しなければならない
  • USBDisk変わらずに維持しなければならない
  • の場合、MyUSBDiskMy-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正規表現は、基本正規表現よりもPO​​SIX拡張正規表現に近く、リテラル角括弧と一致し、\(グループ\)化はバックスラッシュなしで行われます。また、右側のテキストをキャプチャされたグループに\$します。この式は、最初の文字の大文字もキャプチャし、最初にダッシュを表示します。$$1

次の内容になりますFooBarfoo-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でしょうが、今は練習で修正します...


renamerun を使用するには、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テストの実行のためにここに)。

関連情報