古い Web サイトをアーカイブして、静的にホストされている Amazon S3 領域にアップロードしようとしています。
wget
次のコマンドを使用して、の内容を取得できました。
wget --mirror --no-parent --html-extension --page-requisites http://original.com
次に、すべてのリンクを新しい URL に置き換えることができます。
ag -l original\.com -0 | xargs -0 sed -i '' \
's|original.com|old.original.com|g'
この後、 を使用して Web サイトを Amazon S3 にアップロードしましたs3cmd sync
。
私の唯一の問題は、すべての「キャッシュが破壊された」アセットが Amazon でアクセス拒否されるようになったことです。問題は、wget
ファイル名にクエリ パラメータが含まれるファイルを取得し、名前を変更する必要があることです。
したがって、すべてのサブフォルダー内のファイルの名前を再帰的に変更したいと思います。
style.css?ver=4.2.5.css
は次のように改名されますstyle.css
Bash 3.2 を使用して Mac OS X でこれを実行するにはどうすればよいですか?
答え1
これは動作するはずです:
find . -maxdepth 1 -type f -name '*\?*' |\
while read FILENAME
do
IFS='?'
SPLIT_FILENAME=(${FILENAME})
unset IFS
echo mv "${FILENAME}" "${SPLIT_FILENAME}"
# mv "${FILENAME}" "${SPLIT_FILENAME}"
done
はfind .
、すべてのアクションが現在のディレクトリと子ディレクトリで実行されることを示します.
。アクション対象の完全な/実際のファイルパスに自由に変更できます。 は、名前に-name '*\?*'
疑問符 ( ) が含まれるファイルを検索します。?
この初期/デモ バージョンでは、-maxdepth
プロセスがファイル システム上で制御不能にならないように が「1」に設定されており、echo
実際に実行する前にコマンドのバージョンを使用して、何が行われるかを示します。
これを実行して出力が適切であれば、 を-maxdepth 1
次のように調整する-maxdepth 9
か、完全に削除して、 行をコメント アウトしecho
、mv
行のコメントを解除して、次のようになります。
find . -type f -name '*\?*' |\
while read FILENAME
do
IFS='?'
SPLIT_FILENAME=(${FILENAME})
unset IFS
# echo mv "${FILENAME}" "${SPLIT_FILENAME}"
mv "${FILENAME}" "${SPLIT_FILENAME}"
done
のテスト ファイルの例を使用してstyle.css?ver=4.2.5.css
、Mac OS X 10.9.5 (Mavericks) システムでこのスクリプトを実行すると、次の出力が得られました。
mv ./style.css?ver=4.2.5.css ./style.css
私には良いスイッチのように思えます。実際のmv
コマンドで実行すると、ファイルの名前が に正常に変更されました。これは、 やstyle.css
などのテスト ファイルなど、スペースが含まれるファイルでも機能します。this is my style.css?ver=4.2.5.css
my style.css?ver=4.2.5.css
答え2
?
URL/元のファイル名が 1 つだけであれば、Mac OS X でも動作します。
find . -name "*\?*" -exec sh -c 'var="{}" ; mv "{}" "${var%\?*}"' \;
参考までに、これは Linux システム、またはツールがインストールされている任意のシステムでも同様に機能しますrename
。
find . -name "*\?*" -exec rename "s/\?.*//" "{}" \;
答え3
エコーを使って説明します。
# echo 'style.css?ver=4.2.5.css' | cut -d? -f2-9999
ver=4.2.5.css
再帰:
cd <yourdir>
for f in *; do
newf=$( echo $f | cut -d? -f2-9999 )
mv $f $newf
done
前提:<yourdir>
変更したいファイルのみが含まれています。そうでない場合は、for f in *
glob を適宜変更します。最初に echo を使用して最終コマンドをテストする必要があります。つまり、 に置き換えてmv $f $newf
、echo $f $nf
必要な動作が実行されることを確認します。