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


12

私はウェブサイトの変換に取り組んでいます。リンクされ、Webサーバーから提供されるファイルは、大文字と小文字が区別されません。しかし、私は自分のLinuxシステムにサイトのダンプを作成し、データを移行するためのスクリプトを書いています。問題は、ページのリンク文字列とファイルシステムの実際の大文字と小文字の区別の問題に遭遇していることです。

たとえば<a href='/subfolder/PageName.asp'>、実際のファイルがのように、ページにリンクが含まれている場合があります/subfolder/pagename.asp。同様に画像の場合- <img src='spacer_sm.gif'>かもしれませんSpacer_Sm.gif

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

大文字と小文字を区別しないスイッチがあるUNIXコマンドがある場合でも、私はphpを使用しているため、すべてのファイルシステムコマンドに大文字と小文字を区別するオプションがあるわけではありません。


2
同様の前の質問を参照してください。質問がもう少し具体的であるため、ここでより簡単な回答を再投稿しました。
Gilles「SO-邪悪なことをやめなさい」

回答:


8

unixフレーバーにがあるかどうかはわかりませんrename。多くのLinuxがあり、リポジトリを検索する場合、それはperlパッケージの一部です。

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

上記のバージョン

rename -n 

実際にはアクションを実行しませんが、実行されることを出力するだけです。実際にそれを行うには、-nを省略します。


'y/[A-Z]/[a-z]/'一部の「言語」または正規表現は何ですか?
user394 2011

まあ、renameperlパッケージの一部なので、perlだと思いますが、パターンも使用さsedAWKています。私はsed静かなことだけを知っています。またはに翻訳yしましたが、キャラクターの出所がわかりません。translatemap
不明なユーザー

Perlの正規表現である必要があります-Gilles氏の回答でrenameは、Perlスクリプトであると述べています。
user394 2011

はい。perl正規表現を使用してファイル名を変更できます。これは必ずしもperlで記述されているとは限りませんが、より興味深い質問になる可能性があります。
ユーザー不明

9

Zsh

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

説明:zmv与えられた置換テキストに従って、パターンに一致するファイルの名前を変更します。-o-i内部で-imvコマンドにオプションを渡します(以下を参照)。置換テキストでは、$1$2、など、パターン中の連続括弧基です。**すべての(サブ)*ディレクトリを再帰的に意味します。最後(/)はかっこで囲まれたグループではなく、ディレクトリのみに一致することを意味するグロブ修飾子です。小文字に${2:l}変換$2します。

Perlの名前変更

ここでは、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すると、深くネストされたディレクトリが祖先の前に処理されます。


1

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

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

band evarsの説明:

man bash

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


0

受け入れられた回答は、すべてのディレクトリを一度に変更しようとしたため、うまくいきませんでした。私は上記のジルからポータブルと非常によく似stackexchange上の別の解決策が見つかりました:Baraminからの-
/programming/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コマンドをieに変更しました:sed s / cat / dog / g

上記のリンクでバラミンに感謝します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.