Amazon S3 の静的ホスト領域にアップロードする前に、Bash で「wget --mirror」経由で取得したファイルの名前を変更する

Amazon S3 の静的ホスト領域にアップロードする前に、Bash で「wget --mirror」経由で取得したファイルの名前を変更する

古い W​​eb サイトをアーカイブして、静的にホストされている 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か、完全に削除して、 行をコメント アウトしechomv行のコメントを解除して、次のようになります。

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.cssmy 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 $newfecho $f $nf必要な動作が実行されることを確認します。

関連情報