GNU/Linux >> Linux の 問題 >  >> Linux

ディレクトリの下のすべてのディレクトリを小文字にしますか?

ディレクトリの下にあるすべてのディレクトリの名前を小文字にしたい。どのコマンドでそれを行うことができますか?

承認された回答:

すべてのディレクトリを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!' {} +

Linux
  1. Linuxで複数のディレクトリを作成する5つの例

  2. Bashシェルでのクイックディレクトリナビゲーション?

  3. ディレクトリハードリンクを強制的に作成しますか?

  1. Linux でのファイルとディレクトリの作成と削除

  2. symlink ディレクトリ内のファイルを含む、ディレクトリ内のすべてのファイルを再帰的に一覧表示する

  3. ディレクトリ内のすべてのファイルを解凍します

  1. ネストされたすべてのディレクトリの下にあるすべてのファイルを、シェルのグロビングで一致させます

  2. ディレクトリの下のすべてのシンボリックリンクを解除するには?

  3. ディレクトリ内のすべてのフォルダーのサイズを取得する