すべてのファイルとフォルダ(サブフォルダ)を大文字に再帰的に名前変更したいのですが。
小文字に変換するスクリプトをいくつか見つけましたが、それらを逆に変更する方法(小文字から大文字)を変更する方法がわかりません。
私が見つけて小文字で機能するスクリプトですが、変更する方法がわかりませんでした。
rename 'y/A-Z/a-z/' *
からman rename
です。
すべてのファイルとフォルダ(サブフォルダ)を大文字に再帰的に名前変更したいのですが。
小文字に変換するスクリプトをいくつか見つけましたが、それらを逆に変更する方法(小文字から大文字)を変更する方法がわかりません。
私が見つけて小文字で機能するスクリプトですが、変更する方法がわかりませんでした。
rename 'y/A-Z/a-z/' *
からman rename
です。
回答:
Debianとその派生物(Ubuntu、Mintなど)によって配布されたPerlスクリプトrename
を使用していることに注意してください。他のLinuxディストリビューションには、まったく異なる、あまり有用ではないコマンドが付属していrename
ます。
y/A-Z/a-z/
範囲内の各文字を変換しA
てZ
範囲内の対応する文字にa
通じz
、対応する小文字の文字にすなわちASCII大文字。逆の変換を実行するには、を使用しますy/a-z/A-Z/
。同じコマンドであるを書くための別の方法はrename '$_ = uc($_)' *
- uc
であるuの PPER C ASE機能、およびrename
コマンドがに行われた変換に基づいてファイルの名前を変更し$_
、変数。
rename '…' *
現在のディレクトリにあるファイルの名前を変更するだけです*
。ドットファイル(名前がで始まるファイル.
)もスキップされます。
現在のディレクトリとサブディレクトリにあるファイルの名前を再帰的に変更する場合は、find
コマンドを使用して現在のディレクトリを再帰的にたどることができます。ここに問題があります。を呼び出すとrename
、ディレクトリとベース名の部分の両方の名前が変更されます。rename
再帰する前にディレクトリを呼び出すと(find -exec rename … {} \;
)、find
ディレクトリが検出されたため混乱しますが、そのディレクトリに降りようとするときには、そのディレクトリは存在しません。find
対処する前にディレクトリを走査するように指示することでこれを回避できますが、最終的にはに名前foo/bar
を変更しようとしますFOO/BAR
が、ディレクトリFOO
は存在しません。
この問題を回避する簡単な方法は、名前変更コマンドをパスのベース名部分のみに作用させることです。正規表現([^/]*\Z)
は、を含まないパスの最後の部分に一致します/
。
find . -depth -exec rename 's!([^/]*\Z)!uc($1)!e' {} +
シェルのzshは、名前の変更に便利な機能を提供します— Perlよりもさらに不可解ですが、簡潔で、多くの場合、構成が簡単です。
この関数はzmv
、パターンに基づいてファイルの名前を変更します。autoload -U zmv
1回実行してアクティブにします(この行をに入れます.zshrc
)。
zmv
(置換するパターン)の最初の引数では、zshの強力なワイルドカードパターンを使用できます。zmv
(置換テキスト)の2番目の引数では、履歴修飾子を含むパラメーター拡張機能を使用できます。
zmv -w '**/*' '$1$2:u'
説明:
-w
—数値変数を各ワイルドカードパターンに自動的に割り当てる**/*
—サブディレクトリ内のすべてのファイル、再帰的(**/
0、1以上のレベルのサブディレクトリに一致)$1
—最初の数値変数。ここでは、各パスのディレクトリ部分と一致しています。$2:u
— 2番目の数値変数。ここでは、各パスのベース名部分に一致し:u
、値を大文字に変換する修飾子が付いています。追加のボーナスとして、これはアンビエントロケール設定を尊重します。
zmv
書き込んだコマンドがわからない場合は、-n
オプションを渡して、コマンドの動作を印刷し、何も変更しないようにすることができます。出力を確認し、期待どおりに機能する場合は-n
、実際に動作することなくコマンドを再実行します。
Gillesから盗まれた(マイナー編集あり)投稿はこちら
find <DIR> -depth -type d -exec rename -n 's!/([^/]*/?)$!\U/$1!' {} +
find <dir> -exec rename 'y/a-z/A-Z/' {} \;
find
が再帰しているときにディレクトリの名前を変更しているので、それよりも少し複雑です。
find <dir> -depth -exec rename 'y/a-z/A-Z/' {} \;
、ディレクトリの名前変更の問題を処理する必要があります。正しい?
rename
たとえば、その時点でfoo/bar
への変更FOO/BAR
やFOO
その時点での変更がないためです。
find -execdir
| リネーム
これは、Perlの正規表現fuがベース名にのみ作用することを回避するため、相対パスの狂気がなければ、これを行うための最良の方法です。
PATH="$(echo "$PATH" | sed -E 's/(^|:)[^\/][^:]*//g')" \
find a -depth -execdir rename 's/(.*)/\U$1/' '{}' \;
-execdir
最初のcd
ベース名にのみ実行する前に、ディレクトリにね。
残念ながら、PATH
ハッキングの部分を取り除くことはできません。find -execdir
相対パスがある場合、何もすることを拒否しますPATH
...:https : //askubuntu.com/questions/621132/why-using-the-execdir-action- is-insecure-for-directory-which-is-in-the-path / 1109378#1109378
ファイルの名前を変更したいディレクトリに移動した後、これを試してください:
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
ls -l
いったいなぜ名前以外の列を切り捨てるためだけに実行するのでしょうか?)、変数の置換を二重引用符で囲みます。コードが複雑すぎて、空白やその他の特殊文字を含むファイル名が壊れます。find
または**/
を使用してサブディレクトリに再帰しls
ます。の出力は人間が使用するためのものです。
rename 'y/a-z/A-Z/' *
が望むものを手に入れられると思います。テストする場所に注意してください。