我创建了一个~/.bashrc
函数来将一些 Web 目录保存到我的本地磁盘中。除了一些不需要的索引文件之外,它运行良好,这些索引文件在网站中不存在。我使用它的方式如下
crwl http://ioccc.org/2013/cable3/
但它也会检索一些文件,例如index.html?C=D;O=A index.html?C=D;O=D index.html?C=M;O=A index.html?C=M;O=D index.html?C=N;O=A index.html?C=N;O=D index.html?C=S;O=A index.html?C=S;O=D
完整文件列表:
kenn@kenn:~/experiment/crwl/ioccc.org/2013/cable3$ ls
bios index.html?C=D;O=A index.html?C=S;O=A screenshot_flightsim4.png
cable3.c index.html?C=D;O=D index.html?C=S;O=D screenshot_lotus123.png
fd.img index.html?C=M;O=A Makefile screenshot_qbasic.png
hint.html index.html?C=M;O=D runme screenshot_simcity.png
hint.text index.html?C=N;O=A sc-ioccc.terminal screenshot_win3_on_macosx.png
index.html index.html?C=N;O=D screenshot_autocad.png
我想在克隆该目录时排除这些文件,wget
是否有任何wget
开关或技巧可以按原样克隆 Web 目录?
我的脚本功能在.bashrc
:
crwl() {
wget --tries=inf --timestamping --recursive --level=inf --convert-links --page-requisites --no-parent "$@"
}
编辑:我发现了两种可能的解决方法
1)添加-R index.html?*
标志
2)添加-R =A,=D
拒绝 index.html?C=D;O=A
以下文件的标志,但index.html
我不知道哪一个是合适的,但它们似乎都不安全。
答案1
为了排除索引排序文件(例如带有 URL 的文件),index.html?C=...
而不排除任何其他类型的index.html*
文件,确实可以进行更精确的规范。请尝试:-R '\?C='
快速演示
设置不同的空目录,例如
$ mkdir ~/experiment2
$ cd ~/experiment2
然后使用命令的较短版本,没有递归和级别,以便快速进行一页测试:
$ wget --tries=inf --timestamping --convert-links --page-requisites --no-parent -R '\?C=' http://ioccc.org/2013/cable3/
wget 完成后,~/experiment2
将没有index.html?C=...
文件:
.
└── ioccc.org
├── 2013
│ └── cable3
│ └── index.html
├── icons
│ ├── back.gif
│ ├── blank.gif
│ ├── image2.gif
│ ├── text.gif
│ └── unknown.gif
└── robots.txt
4 directories, 7 files
因此,它确实排除了那些冗余的 index-sortindex.html?C=...
目录,同时保留了所有其他 index.html 目录,在本例中只是index.html
实施
-R '\?C='
因此,只需通过更新 shell 函数来实现~/.bashrc
:
crwl() {
wget --tries=inf --timestamping --recursive --level=inf --convert-links --page-requisites --no-parent -R '\?C=' "$@"
}
然后记得在新终端中测试,或者重新启动 bash 以使其生效:
$ . ~/.bashrc
然后在新目录中尝试,进行比较:
$ mkdir ~/experiment3
$ cd ~/experiment3
$ crwl http://ioccc.org/2013/cable3/
保修单
- 仅限 wget 1.14 及更高版本。因此,如果您
wget -V
说的是 1.13,则可能不起作用,您需要亲自删除那些讨厌的程序index.html?C=...
,或者尝试获取更新版本的 wget。 - 通过指定您想要
-R
或拒绝的模式来工作,在这种情况下,具有的?C=
模式是index.html?C=...
版本的典型index.html
。 - 但是
?
恰好是 wget 通配符,因此要匹配文字,?
您需要将其转义为\?
- 不要中断 wget。因为 wget 处理可浏览网页的方式似乎是先下载,然后再删除,好像它需要检查这些页面是否有进一步的链接需要抓取。所以如果你中途取消,你仍然会得到
index.html?C=
文件。只有你让 wget 完成,wget 才会按照你的要求-R
删除任何临时下载的index.html?C=...
文件
答案2
如果您不想使用 wget 的删除机制或者系统不支持此选项,请在下载后尝试此选项。
FIND=$($WHICH find)
PWD2=$($WHICH pwd)
SH=$($WHICH sh)
ECHO=$($WHICH echo)
LESS=$($WHICH less)
命令:
$FIND "$($PWD2)" -regextype posix-egrep -type f -regex '^(.*?html\?C=[DNSM];O=[AD])$' -exec "$SH" -c 'o="{}";$ECHO -f -v "${o}"' \; | $LESS
当您对输出满意时,请执行以下操作:
- 发出以下命令(见下面的框)
- 将上述命令中的 $ECHO 替换为 $RM。
- 删除管道 (|) 和 $LESS,以获取实际输出。
(如果您删除整个文件系统,我不负责,因此这样做。)
RM=$($WHICH rm);export RM
$FIND "$($PWD2)" -regextype ... ;$RM -f -v "${xox}"' \;
希望这可以帮助。