名前変更を使用してすべての名前を大文字に再帰的に変更する方法

名前変更を使用してすべての名前を大文字に再帰的に変更する方法

すべてのファイルとフォルダ(サブフォルダ)の名前を繰り返し大文字に変更したいと思います。

小文字に変換するいくつかのスクリプトが見つかりましたが、それを変更する方法がわからないので、反対方向(小型から大型)で実行されます。

私が見つけたスクリプトは小文字で動作しますが、修正方法がわかりません。

rename 'y/A-Z/a-z/' *

からman rename

ベストアンサー1

ご利用ください。Perlスクリプトは次のように呼び出されます。renameDebianとその派生製品(Ubuntu、Mintなど)によって配布されます。他の Linux ディストリビューションでは、次のようなまったく異なる、あまり役に立たないコマンドを提供します。rename

y/A-Z/a-z/範囲A内の各文字を範囲内の対応する文字Zに変換します。つまり、ASCII 大文字が対応する小文字に変換されます。逆変換を実行するには、を使用します。同じコマンドを作成する別の方法は - です。azy/a-z/A-Z/rename '$_ = uc($_)' *ucあなたフェルrename変数への変換に基づいて$_ファイル名を変更する ase 関数です。

rename '…' *一致するファイルなので、現在のディレクトリのファイル名のみを変更してください*ファイルをクリック名前が.()で始まるファイルもスキップされます。

現在のディレクトリとサブディレクトリのファイル名を繰り返し変更するには、次のようにします。findこのコマンドは現在のディレクトリを再帰的に検索します。ここには難しさがあります。をrename呼び出すと、ディレクトリとデフォルトの名前部分の名前が変更されます。renameディレクトリに再帰する前にディレクトリ()を呼び出すfind -exec rename … {} \;と、ディレクトリfindを見つけるために混乱します。しかし、そのディレクトリに移動しようとすると、そのディレクトリはもう存在しません。これを行う前にディレクトリを繰り返してこの問題を解決できますが、find最終的に名前を変更しようとし、foo/barディレクトリFOO/BARFOO存在しなくなります。

この問題を回避する簡単な方法は、名前変更コマンドがパスのデフォルトの名前部分でのみ機能するようにすることです。正規表現([^/]*\Z)の一致には含まれません/

find . -depth -exec rename 's!([^/]*\Z)!uc($1)!e' {} +

シェルより便利な名前変更機能を提供します。 Perlよりはるかに難解ですが、より簡潔で一般的に書くのは簡単です。

機能zmvパターンに従ってファイル名を変更します。autoload -U zmv有効にするには、一度実行してください(この行をあなたの行に入れてください.zshrc)。

zmv(置き換えるパターン)の最初の引数でzshの機能を使用できます。ワイルドカードパターンzmv(代替テキスト)の2番目のパラメータでは、パラメータ拡張以下を含む機能履歴修飾子

zmv -w '**/*' '$1$2:u'

説明する:

  • -w- 各ワイルドカードパターンに数値変数を自動的に割り当てます。
  • **/*- サブディレクトリ内のすべてのファイル、再帰的(**/0、1、またはそれ以上のサブディレクトリレベルと一致)
  • $1— 各パスのディレクトリ部分が一致する最初の数値変数
  • $2:u- 2番目の数値変数。ここでは、各パスのデフォルト名部分と一致し、:u修飾子を使用して値を大文字に変換します。

追加ボーナスとして、これは環境ロケールを尊重します。

zmv作成しているコマンドがわからない場合は、オプションを渡して-n何も変更せずにコマンドが実行するジョブを印刷できます。出力を確認し、-n必要に応じて動作したら、実際に何もせずにコマンドを再実行してください。

おすすめ記事