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

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

ウェブサイトの切り替え作業中です。 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深くネストされたディレクトリが親ディレクトリの前に処理されます。

答え2

あなたのUnixバージョンにこの機能があるかどうかはわかりませんrename。多くのLinuxにこの機能があり、リポジトリを検索すると、Perlパッケージの一部です。

find ./ -depth -exec rename -n 'y/[A-Z]/[a-z]/' {} ";"

上記のバージョンが付属しています。

rename -n 

実際にジョブを実行せずに実行するジョブのみを印刷します。実際にこれを行うには、-nを省略します。

答え3

次のディレクトリ構造では機能しません。

JKL/
deF/
ABC/DEf
ABC/gHi
ghi/jkL

以下は実際の例です。

for i in `find | sort -r | sed '$d'`; do \
   b=${i%/*}; e=${i##*/}; mv $i $b'/'${e,,}; done

bvarsの説明e

man bash

次に、次のキーシーケンスを使用します。/,,Enterbb

答え4

許可された答えは、すべてのディレクトリを一度に変更しようとしたので、私には適していませんでした。上記のGillesのポータブルソリューションと非常によく似たstackexchangeの別のソリューションを見つけました。バラミンから -
https://stackoverflow.com/questions/4268591/unix-rename-files-directories-to-uppercase

ここにコピーしました。

find . -depth | \
while read LONG; do
   SHORT=$( basename "$LONG" | tr '[:lower:]' '[:upper:]' )
   DIR=$( dirname "$LONG" )
   if [ "${LONG}" != "${DIR}/${SHORT}"  ]; then
     mv "${LONG}" "${DIR}/${SHORT}"
   fi
done

tr コマンドを次のように変更しました: sed s/cat/dog/g

上記リンクのBaraminに感謝します。

関連情報