在上傳到 Amazon S3 靜態託管區域之前重新命名透過 Bash 中的「wget --mirror」取得的文件

在上傳到 Amazon S3 靜態託管區域之前重新命名透過 Bash 中的「wget --mirror」取得的文件

我正在嘗試將舊網站存檔並上傳到靜態託管的 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'

之後,我使用 將該網站上傳到 Amazon S3 s3cmd sync

我現在唯一的問題是,所有「快取失效」的資產現在在亞馬遜上都被拒絕存取。問題是wget檔案名稱中包含查詢參數,我需要重命名它們。

所以我想在所有子資料夾中遞歸地重命名文件,例如:

  • style.css?ver=4.2.5.css被重新命名為style.css

如何在 Mac OS X 中使用 Bash 3.2 執行此操作?

答案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

對我來說似乎是一個很好的轉變。使用 realmv命令運行它,檔案成功重命名為style.css.這也適用於其中包含空格的文件,例如this is my style.css?ver=4.2.5.css和 之類的測試文件my style.css?ver=4.2.5.css

答案2

?這在 Mac OS X 上可以工作,假設URL/原始檔名只有一個:

find . -name "*\?*" -exec sh -c 'var="{}" ; mv "{}" "${var%\?*}"' \;

作為參考,這在 Linux 系統(或任何安裝了該工具的系統)上也適用rename

find . -name "*\?*" -exec rename "s/\?.*//" "{}" \;

答案3

我將使用 echo 來演示。

# 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並確保它執行您想要的操作。

相關內容