ディレクトリの下にあるすべてのディレクトリの名前を小文字にしたい。どのコマンドでそれを行うことができますか?
承認された回答:
すべてのディレクトリを1つのレベルで、または再帰的に?
Zsh
1つのレベルで:
autoload zmv
zmv -o-i -Q 'root/(*)(/)' 'root/${1:l}'
再帰的に:
zmv -o-i -Q 'root/(**/)(*)(/)' 'root/$1${2:l}'
説明: zmv 指定された置換テキストに従って、パターンに一致するファイルの名前を変更します。 -o-i -iを渡します 各mvのオプション 内部でコマンドを実行します(以下を参照)。置換テキストでは、 $ 1 、 $ 2 、などは、パターン内の連続する括弧で囲まれたグループです。 **コード> すべての(サブ)*ディレクトリを再帰的に意味します。最後の(/) は括弧で囲まれたグループではなく、ディレクトリのみに一致することを意味するglob修飾子です。 $ {2:l} $ 2を変換します 小文字にします。
ポータブル
1つのレベルで:
for x in root/*/; do mv -i "$x" "$(printf %s "$x" | tr '[:upper:]' '[:lower:]')"; done
最後の/ マッチングをディレクトリに制限し、 mv -i 衝突の場合に確認を求めさせます。 -iを削除します 衝突の場合に上書きし、 yesn|を使用します… 。プロンプトが表示されず、衝突するような名前変更を実行しないようにします。
再帰的に:
find root/* -depth -type d -exec sh -c '
t=${0%/*}/$(printf %s "${0##*/}" | tr "[:upper:]" "[:lower:]");
[ "$t" = "$0" ] || mv -i "$0" "$t"
' {} ;
-depthの使用 深くネストされたディレクトリが祖先の前に処理されることを保証します。名前の処理は、 /が存在することに依存しています;現在のディレクトリでoperateを呼び出す場合は、 ./ *を使用します。 (に対処するためにシェルスクリプトを適応させる。 または* 読者のための演習として残されています。
Perlの名前変更
ここでは、DebianとUbuntuが / usr / bin / prenameとして出荷するPerl名前変更スクリプトを使用します。 (通常は renameとして利用できます 同じように)。 1つのレベルで:
rename 's!/([^/]*/?)$!L/$1!' root/*/
再帰的に、bash≥4またはzshの場合:
shopt -s globstar # only in bash
rename 's!/([^/]*/?)$!L/$1!' root/**/*/
再帰的、移植可能:
find root -depth -type d -exec rename -n 's!/([^/]*/?)$!L/$1!' {} +