2011-03-04 13 views
0

私は約50のテキストファイル(PHP)と何百もの画像を含むフォルダを持っています。私はすべての画像をサブフォルダに移動し、PHPファイルを更新して、それらの画像への参照が新しいサブフォルダを指し示すようにしたいと思います。フォルダ内のすべてのイメージをサブフォルダに移動し、テキストファイル内のすべての参照をそのイメージの新しい場所に更新しますか?

すべての画像を非常に簡単に移動できますが(mv * .jpg/image、mv * .gif/imageなど)、すべてのテキストファイルを更新する方法はわかりません。 Regexをファイル内のすべてのイメージと一致させるために作成しなければならないと仮定し、何らかの形で新しいディレクトリをイメージファイル名に追加する必要がありますか?これはシェルスクリプトでもっとも効果がありますか?どんな助けもありがたいです(サーバーはLinux/CentOS5です)

ありがとう!

+0

正規表現を使用します。 'sed'はおそらくあなたの最善の策です。また、PHPスクリプトには、将来の場所を変更する必要がある場合に備えて、imagesディレクトリの変数が必要です。 – chrisaycock

答えて

0

をあなたはこのようにそれを行うことができます:

#!/bin/sh 
for f in *.jpg *.png *.gif; do 
    mv $f gfx/ 
    for p in *.txt; do 
     sed -i bak s,`echo $f`,gfx/`echo $f`,g $p 
    done 
done 

それは、すべてのJPG/PNG/GIFファイルを検索し、 "GFX" サブフォルダに移動さ各txtファイル(または編集したいファイルの種類)に応じて、 "sed"をインプレースで使用してパスを変更します。

Btw。追加の拡張子 "bak"を持つ編集済みファイルのバックアップファイルを作成します。これは、スクリプトの "bak"部分を省略することで回避できます。

+0

何百ものファイルがあるので、これは非常に遅くなります。 –

+0

これは速く実行できますが、解決策です。おそらく、代わりにPythonでそれを行い、すべてのパスをキャッシュしてリストに入れ替え、その後にそれらの変更を問題のファイルに適用することを好みます。 –

+0

これは私が使用を終了したものです - それは少し遅かったが、それはちょっとトリックでした - ありがとう! –

1

sed-iスイッチはおそらくあなたが探しているものです。 -iは、sedにインプレースファイルを編集するよう指示します。

このような何かが動作するはずです:

find /my/php/location -name '*.php' | xargs sed -ie 's,/old/location/,/new/location/,g' 
+1

'grep'の必要はありません:' find/my/php/location -name '* php' –

+0

@Dennisありがとう!編集するでしょう –

0

これは、すべてのイメージを 'images'というサブディレクトリに移動し、ベースネームの直前に 'images /'を追加することによってイメージファイルへのリンクのみを変更します。

mkdir images 
mv -f *.{jpg,gif,png,jpeg} images/ 
sed -i 's%[^/"'\'']\+\.\(gif\|jpg\|jpeg\|png\)%images/\0%g' *.php 

何千ものファイルがある場合は、findとxargsを使用する必要があります。したがって、少し遅い

find ./ -regex '.*\(gif\|jpg\|png\|jpeg\)' -exec mv {} /tmp \; 
find ./ -name \*.php -print0 | \ 
xargs -0 sed -i 's%[^/"'\'']\+\.\(gif\|jpg\|jpeg\|png\)%images/\0%g' *.php 

注意:リモートURLを持つ画像へのパスも変更されます。また、あなたのディレクトリの完全なバックアップを持っていることを確認してください、PHPの構文と変数名は問題を引き起こす可能性があります。

関連する問題