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

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

背景:引起这个问题的我的具体问题如下。我是一名 slackware Linux 用户,并于 2019 年 3 月 23 日使用以下命令镜像了他们的发行版

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

然后最近,2019 年 8 月 29 日,我只需将选项添加-N到上述命令即可刷新/更新我的本地镜像。但这导致我的镜像包含许多相同软件包的“重复”旧版本和新版本,只是版本号不同,例如,

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 但我不确定如何使用它作为某些过程的输入,该过程将删除旧文件而不是在当前文件列表中。您能给我指出一个联机帮助页或其他描述如何执行此操作的内容吗?再次感谢。

此外,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.

答案1

免责声明:我目前无法测试我建议的任何代码。与往常一样,请在将此代码构建为正确的脚本之前仔细测试。

鉴于它是一个包列表(因此具有不带空格的简单文件名等),您可能可以使用一些非常简单的代码来挑选文件名

# 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

如您所见,您需要删除最后一个echo才能rm完成其工作

此外,下次您想要更新镜像时,您可以修改该comm行(通过交换两个文件参数)以查找您要更新的文件集。拥有,并将它们喂给wget.

相关内容