ディレクトリの下にあるすべてのディレクトリの名前を小文字にしたい。どのコマンドでそれを行うことができますか?
承認された回答:
すべてのディレクトリを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!' {} +