ディレクトリ下のすべてのディレクトリを小文字に変更

ディレクトリ下のすべてのディレクトリを小文字に変更

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

答え1

すべてのディレクトリは1つのレベルにありますか、それとも再帰的ですか?

ジッシュ

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の連続した括弧のグループです。**すべての(サブ)*ディレクトリを再帰的に表します。最後のグループ(/)は大括弧で囲まれたグループではなく、グローバル修飾子です。つまり、ディレクトリだけが一致することを意味します。小文字に${2:l}変換します。$2

持ち運べる

1つのレベルで:

for x in root/*/; do mv -i "$x" "$(printf %s "$x" | tr '[:upper:]' '[:lower:]')"; done

最後に、/一致するディレクトリを制限し、mv -i競合が発生した場合は確認が必要です。-iクラッシュしたときに上書きするには、削除してからを使用してくださいyes n | for …。メッセージは表示されず、潜在的に競合する可能性のある名前変更を行わないでください。

再帰的に:

find root/* -depth -type d -exec sh -c '
    t=${0%/*}/$(printf %s "${0##*/}" | tr "[:upper:]" "[:lower:]");
    [ "$t" = "$0" ] || mv -i "$0" "$t"
' {} \;

使用すると、-depth深くネストされたディレクトリが親ディレクトリの前に処理されます。名前の処理は存在に依存します/。現在のディレクトリからタスクを呼び出すために使用します./*(対処するためにシェルスクリプトを調整するか、.読者*に練習として残してください)。

パールの名前を変更する

ここでは、DebianとUbuntuに付属のPerl名前変更スクリプトを使用しています/usr/bin/prename(通常は利用可能です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!' {} +

答え2

これを実行できる単一のコマンドはありませんが、次のようにできます。

for fd in */; do
  #get lower case version
  fd_lower=$(printf %s "$fd" | tr A-Z a-z)
  #if it wasn't already lowercase, move it.
  [ "$fd" != "$fd_lower" ] && mv "$fd" "$fd_lower"
done

十分に強力でなければならない場合は、大文字と小文字が異なる2つのディレクトリがすでにある場合を考慮する必要があります。

一行で:

for fd in */; do fd_lower=$(printf %s "$fd" | tr A-Z a-z) && [ "$fd" != "$fd_lower" ] && mv "$fd" "$fd_lower"; done

答え3

私はこれが単純な挑戦だと思います:)最初にテストケースを構築します。

$ for d in foo Bar eVe; do mkdir -p dcthis/$d; touch dcthis/a${d}.txt; done
$ ls dcthis/
Bar     aBar.txt    aeVe.txt    afoo.txt    eVe     foo

find以前はディレクトリを大文字にして 。sh -c 'mv {} echo {} | tr [:upper:] [:lower:]'sh -cfind

$ (cd dcthis && find . -maxdepth 1 -type d -path '*[A-Z]*' -exec sh -c 'mv {} `echo {} | tr [:upper:] [:lower:]`' \;)
$ ls dcthis/
aBar.txt    aeVe.txt    afoo.txt    bar     eve     foo

注:このソリューションは競合を引き起こす可能性があるケースを特定しません!

答え4

find -execdir rename

デフォルト名にのみ影響する正規表現を使用して、ファイルとディレクトリの名前を変更します。

したがって、プレフィックスに対して次のことができます。

PATH=/usr/bin find . -depth -execdir rename 's/(.*)/\L$1/' '{}' \;

またはファイルにのみ影響します。

PATH=/usr/bin find . -type f -execdir rename 's/(.*)/\L$1/' '{}' \;

-execdirデフォルト名のみを入力する前に、まずそのディレクトリに移動してくださいcd

以下でこれについてより詳細に説明する。https://stackoverflow.com/questions/16541582/find-multiple-files-and-rename-them-in-linux/54163971#54163971

関連情報