背景:引起这个问题的我的具体问题如下。我是一名 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
.