我四處尋找,但未能找到問題的答案。我不確定這是否是正確的論壇,但我希望這裡有人能夠提供幫助。
直到最近,我一直在使用 wget (FTP) 將我的網站備份到本地硬碟,使用鏡像選項,沒有任何問題。最近,保存映像的目錄達到了託管服務設定的 FTP 清單中可以包含的項目數的限制。我沒有對該帳戶的 SSL 存取權。
我可以在遠端伺服器上執行腳本,並在檔案中取得完整的目錄清單 (ls),然後將其下載到本機。
是否可以將此文件提供給 wget 並將其鏡像到我的本機驅動器,就像在達到列表限制之前所做的那樣?我希望 wget 讀取生成的列表並檢查更改和添加的文件。以下是我一直找不到答案的問題:
1) 產生所需資訊的正確 ls 指令是什麼?目前,我只取得實際的檔案名,但我確信還需要更多。
2) 帶有鏡像選項的 wget 是否仍然可以使用輸入文件,或者它是否只是下載輸入文件中的所有文件而不檢查更改的狀態?我完全沒有找到關於這種組合的資訊——只找到其中之一。我不想進行測試並最終獲得目錄的完整備份 - 浪費頻寬和時間來拉取所有資料。
答案1
你可以做到這一點,唯一的問題是從LS這在遠端電腦和本機上是相同的。我的ls有一個選項
--時間樣式=+%s顯示文件自紀元以來的最後修改時間(以秒為單位),這應該在兩台計算機上匹配。我假設您只想對一個目錄執行此操作,否則find
如果您有該命令會更合適。
在遠端將所需目錄中的 ls 寫入檔案:
cd ... # cd to the directory to list
ls -l --time-style=+%s . >/tmp/listfile
在本機上,將遠端複製/tmp/listfile
到本機/tmp/listfile
,然後使用
awk抑制輸出的前 4 列並對檔案大小、日期和檔案名稱清單進行排序。 (我假設你的檔案名稱可能帶有空格,因此出現奇怪的 awk)。
awk '{$1="";$2="";$3="";$4="";print}' </tmp/listfile | sort >/tmp/a
在鏡像目錄中獲得相同的列表:
cd ... # cd to same directory we listed remotely
ls -l --time-style=+%s . | awk '{$1="";$2="";$3="";$4="";print}' | sort >/tmp/b
比較兩個排序清單並刪除相同的行 通訊。刪除大小和日期列(順便說一下,在 /tmp/b 中而不是在 /tmp/a 中的行開頭的製表符,以及 2 個列間空格)並刪除重複的文件名獨特的。 (您不需要再次排序,因為重複的行是相鄰的)。
comm -3 /tmp/a /tmp/b | awk '{$1="";$2="";print substr($0,3)}' | uniq >/tmp/c
/tmp/c 中的清單是所有新檔案、不同大小或時間戳記的檔案或已刪除的檔案。將每一個傳遞給 wget 來取得(仍在適當的目錄中)。
while read file
do rm -f "$file"
wget -N --no-directories ..../"$file" # non recursive single file to .
done </tmp/c
您應該將 wget 映像配置為不再取得此目錄。
如果可以find ... -printf '%9s %T+ %p\n'
,您可以使用這種技術,從鏡像目錄的頂部開始,自己有效地進行鏡像。