Rsync

rsync-like –delete 功能與 wget(不是 wget 的 –delete-after)

  • August 30, 2019

**背景:**我提出這個問題的具體問題如下。我是 slackware linux 使用者,並在 2019 年 3 月 23 日使用以下命令鏡像了他們的發行版

wget -r -np -R "index.html*" https://mirror.slackbuilds.org/slackware/slackware64-current/

-N然後最近,2019 年 8 月 29 日,我只需通過將選項添加到上述命令來刷新/更新我的本地鏡像。但這導致我的鏡像包含許多相同軟體包的“重複”舊版本和新版本,只是版本號不同,例如,

SDL2_mixer-2.0.4-x86_64-1.txz
SDL2_mixer-2.0.4-x86_64-2.txz
libcddb-1.3.2-x86_64-5.txz
libcddb-1.3.2-x86_64-6.txz

等(我的意思是很多等:)

**問題:**所以我真正想做的是

rsync -av --delete https://mirror.slackbuilds.org/slackware/slackware64-current/ my-slackware64-mirror-directory/

rsync --delete將自動從我的鏡像目錄中刪除所有舊版本,這些舊版本不再存在於 slackbuilds.org 上。但是,我在 slackbuilds 上沒有任何類型的帳戶,因此(據我所知)無法執行 rsync 以從中獲取文件。有沒有 wget 方法來完成同樣的事情?或者任何方式?謝謝。

編輯:長時間回复@roaima 的評論…

    感謝@roaima 的建議。現在你提到它,是的,在頂級目錄中有這樣一個文件,可以預見地命名為 FILELIST.TXT 但我不確定如何將它用作某些程序的輸入,該程序將 –delete old files not在目前文件列表中。您能否指出我的手冊頁或其他描述如何執行此操作的內容?再次感謝。

此外,該 FILELIST.TXT 的   ls -al   格式可能不是罐裝程序最容易解析的格式(儘管我可能會編寫一個小型 C 程序將其轉換為任何合適的格式)。文件中的一些典型行是

-rw-r--r--  1 root root   1637708 2019-08-15 18:06 ./slackware64/a/bash-5.0.009-x86_64-1.txz
-rw-r--r--  1 root root       163 2019-08-15 18:06 ./slackware64/a/bash-5.0.009-x86_64-1.txz.asc
-rw-r--r--  1 root root       226 2018-10-17 03:06 ./slackware64/a/bin-11.1-x86_64-3.txt
-rw-r--r--  1 root root     39576 2018-10-17 03:06 ./slackware64/a/bin-11.1-x86_64-3.txz
-rw-r--r--  1 root root       163 2018-10-17 03:06 ./slackware64/a/bin-11.1-x86_

與您明顯有先見之明的建議非常相關,文件的前幾行是備註

Wed Aug 28 21:44:15 UTC 2019
Here is the file list for this directory.  If you are using a 
mirror site and find missing or extra files in the disk 
subdirectories, please have the archive administrator refresh
the mirror.

免責聲明:我目前無法測試我建議的任何程式碼。與往常一樣,請在將此程式碼建構到正確的腳本之前仔細測試。

鑑於它是一個包列表(因此具有沒有空格的簡單文件名等),您可能可以使用一些非常簡單的程式碼來挑選文件名

# Get last item from each line of FILELIST
awk '{print $NF}' FILELIST | sort >weblist

# Generate a list of your files
find -type f -print | sort >mylist

# Compare results
comm -23 mylist weblist >diffs

# Remove old files
xargs -r echo rm -fv <diffs

如您所見,您需要刪除 finalecho以允許rm其工作

此外,下次您想更新鏡像時,您可以修改該comm行(通過交換兩個文件參數)以找到您沒有的文件集,並將這些文件提供給wget.

引用自:https://unix.stackexchange.com/questions/538188