
すべてのファイルとフォルダ(サブフォルダ)の名前を繰り返し大文字に変更したいと思います。
小文字に変換するいくつかのスクリプトが見つかりましたが、それを変更する方法がわからないので、反対方向(小型から大型)で実行されます。
私が見つけたスクリプトは小文字で動作しますが、修正方法がわかりません。
rename 'y/A-Z/a-z/' *
からman rename
。
答え1
ご利用ください。Perlスクリプトは次のように呼び出されます。rename
Debianとその派生製品(Ubuntu、Mintなど)によって配布されます。他の Linux ディストリビューションでは、次のようなまったく異なる、あまり役に立たないコマンドを提供します。rename
。
y/A-Z/a-z/
範囲A
内の各文字を範囲内の対応する文字Z
に変換します。つまり、ASCII 大文字が対応する小文字に変換されます。逆変換を実行するには、を使用します。同じコマンドを作成する別の方法は - です。a
z
y/a-z/A-Z/
rename '$_ = uc($_)' *
uc
あなたフェル氏rename
変数への変換に基づいて$_
ファイル名を変更する ase 関数です。
rename '…' *
一致するファイルなので、現在のディレクトリのファイル名のみを変更してください*
。ファイルをクリック名前が.
()で始まるファイルもスキップされます。
現在のディレクトリとサブディレクトリのファイル名を繰り返し変更するには、次のようにします。find
このコマンドは現在のディレクトリを再帰的に検索します。ここには難しさがあります。をrename
呼び出すと、ディレクトリとデフォルトの名前部分の名前が変更されます。rename
ディレクトリに再帰する前にディレクトリ()を呼び出すfind -exec rename … {} \;
と、ディレクトリfind
を見つけるために混乱します。しかし、そのディレクトリに移動しようとすると、そのディレクトリはもう存在しません。これを行う前にディレクトリを繰り返してこの問題を解決できますが、find
最終的に名前を変更しようとし、foo/bar
ディレクトリFOO/BAR
がFOO
存在しなくなります。
この問題を回避する簡単な方法は、名前変更コマンドがパスのデフォルトの名前部分でのみ機能するようにすることです。正規表現([^/]*\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
必要に応じて動作したら、実際に何もせずにコマンドを再実行してください。
答え2
答え3
Gillesの投稿で盗まれた(少し修正済み)ここ
find <DIR> -depth -type d -exec rename -n 's!/([^/]*/?)$!\U/$1!' {} +
答え4
ファイル名を変更したいディレクトリに移動し、次のことを試してください。
for word in `ls -ltr |tail -n +2 |awk '{print $9}'`
do
a=$(echo $word | tr '[a-z]' '[A-Z]')
mv $word $a
echo "Done Successfully"
done