我正在嘗試將舊網站存檔並上傳到靜態託管的 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 $newf
為echo $f $nf
並確保它執行您想要的操作。