誰かがオンラインですべての大文字ファイルの名前を小文字に変更するように要求するたびに、次のコマンドが提案されていることを確認します。
find "$(pwd)" -depth -exec rename 's/(.*)\/([^\/]*)/$1\/\L$2/' {} \;
この部分は理解していますfind "$(pwd)" -depth -exec rename
。
誰かがそれを分析し、名前が変更された正規表現コマンドを説明できますか?つまり:'s/(.*)\/([^\/]*)/$1\/\L$2/'
\/([^\/]*)
それだけでなく、なぜ(.*)
?$1
Bashに何があるかはわかりますが$1
、それはどういう\L$2
意味ですかrename
?また、これが単純なものとどう違うかを知りたいです。
find "$(pwd)" -depth -exec rename 'y/A-Z/a-z/' {} \;
最後に、このような学習のためにどの本や資料をお勧めしますか?マニュアルページを読みまし
rename
たが、そのような使い方の説明が見つかりませんでした。
答え1
エスケープされていない最初s/
、最後、および中間/
文字は代替演算子と区切り文字であるため、パターンと代替文字があります。/
(.*)\/([^\/]*)
$1\/\L$2
最初の(.*)\/([^\/]*)
エントリは、(.*)\/
最後のファイル名の前のパスである最後のスラッシュまでのすべてのエントリと一致します。最後の項目は、([^\/]*)
文字列の末尾にスラッシュを除くすべての項目と一致します。
置換では、$1
角かっこ内の最初のキャプチャグループに一致するパス、つまりパスを再配置します。次に、次の\L
部分、2番目のキャプチャグループ、または$2
ファイル名を小文字にします。
ここでの最終結果は、小文字のみが最終ファイル名部分にのみ適用されることです。例えばdir/OTHERDIR/FOO.txt
。後者に名前を直接変更することはおそらく存在しないのでうまくいきません。dir/OTHERDIR/foo.txt
dir/otherdir/foo.txt
dir/otherdir
しかし...私の考えでは、次のように実行できるようです。
find . -depth -execdir rename 'y/A-Z/a-z/' {} +
"$(pwd)"
(またはより簡単に"$PWD"
)は、相対パスではなく絶対パスを生成するためにのみ機能しますが、find
これを行う必要はありません。フルパスを処理する問題を排除して、基本レベルですべてのディレクトリを実行するのではなく、各ディレクトリを個別に-execdir
実行します。各名前変更呼び出しに複数のファイルが提供されるのではなくrename
。{} +
{} \;
find
ただし、これらはすべて26文字のASCII文字にのみ適用でき、実際の言語で見つかった残りの文字(例:äöåé)には適用されない可能性があります。