ディレクトリの下のすべてのディレクトリ名を小文字にしたいと思います。これを行うにはどのコマンドを使用できますか?
ベストアンサー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!' {} +