ディレクトリツリー全体を小文字の名前に変更する

ディレクトリツリー全体を小文字の名前に変更する

ウェブサイトの切り替え作業中です。 Webサーバーから接続および提供されるファイルは大文字と小文字を区別しません。しかし、Linuxシステムにサイトをダンプし、データを移行するスクリプトを書いています。問題は、ページのリンク文字列とファイルシステムの実際の単語の大文字と小文字の間に大文字と小文字が区別される問題があることです。

たとえば、ページに<a href='/subfolder/PageName.asp'>物理ファイルへのリンクがあるとします。イメージ/subfolder/pagename.aspにも同じです。<img src='spacer_sm.gif'>Spacer_Sm.gif

だから私の考えは、すべてのディレクトリとファイル名をウェブサイトからダウンロードした小文字に変更することです。どうすればいいですか?(もっと良い方法はありますか?)

大文字と小文字を区別しないスイッチを持つunixコマンドがありますが、PHPを使用しているため、すべてのファイルシステムコマンドに大文字と小文字を区別するオプションはありません。

ベストアンサー1

ジッシュ

zmv -o-i '(**/)(*)' '$1${2:l}'

説明:zmv指定された代替テキストに基づいてパターンに一致するファイルの名前を変更します。-o-i各基本コマンドにオプションを渡します-i(下記参照)。mv代替テキストでは、背中は$1パターン$2の連続した括弧のグループです。**すべての(サブ)*ディレクトリを再帰的に表します。最後のグループ(/)は大括弧で囲まれたグループではなく、グローバル修飾子です。つまり、ディレクトリだけが一致することを意味します。小文字に${2:l}変換します。$2

パールの名前を変更する

ここでは、DebianとUbuntuに付属のPerl名前変更スクリプトを使用しています/usr/bin/prename(通常は利用可能ですrename)。 bash ≥4またはzshを使用してください。

shopt -s globstar  # only in bash
rename 's!/([^/]*/?)$!\L/$1!' **/*

他のシェルの場合:

find . -depth -exec rename -n 's!/([^/]*/?)$!\L/$1!' {} +

持ち運べる

再帰的に:

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

使用すると、-depth深くネストされたディレクトリが親ディレクトリの前に処理されます。

おすすめ記事