我尝试了一些方法,但尝试将变量传递给此代码,因为它的文本文件不起作用。但奇怪的是,如果支票看到它只是一个网址,那就完美了。
我已经在wget中尝试了-i,在$ line附近引用了{},将$目录放入wget中。没有。它将其读取为空白或文件名,而不是文件中的URL。
除此之外,循环第一部分的$ savefile.log始终返回directory.txt.log。试过$ line.log修复那个和nada。我确实需要将它剥离为:和\在文件名中无效。
#!/bin/bash
read -p "Enter directory or .txt file: `echo $'\n> '`" directory
savefile=$(echo "${directory//"http://"}" | cut -d '/' -f1)
if [[ $directory == *.txt ]]
echo
echo "Spidering $directory"
while IFS='' read -r line || [[ -n "$line" ]]; do
echo "$line"
wget -np --spider -e robots=off --no-check-certificate $line 2>> $savefile.log
echo
echo "Spider saved to $savefile.log"
done < $directory
else
echo
echo "Spidering $directory"
wget -r -np --spider -e robots=off --no-check-certificate $directory 2>> $savefile.log
echo
echo "Spider saved to $savefile.log"
fi
答案 0 :(得分:0)
EDITx2 - : 删除我的旧答案,因为它是错误的,终于有机会坐下来运行代码,并根据我认为你想要的东西应该这样做:
#!/bin/bash
read -p "Enter directory or .txt file: `echo $'\n> '`" directory
if [[ $directory == *.txt ]]; then
echo
echo "Spidering $directory"
while IFS='' read -r line || [[ -n "$line" ]]; do
echo "$line"
savefile="$(basename "${directory//.txt}")"
wget -np --spider -e robots=off --no-check-certificate $line 2>> $savefile.log
echo
echo "Spider saved to $savefile.log"
done < $directory
else
echo
echo "Spidering $directory"
savefile=$(echo "${directory//"http://"}" | cut -d '/' -f1)
wget -r -np --spider -e robots=off --no-check-certificate $directory 2>> $savefile.log
echo
echo "Spider saved to $savefile.log"
fi
一个大问题是您忘记了; then
行末尾的if [[ ... ]]
。
使用savefile,我猜你的目标是在网址上的“.com”之后删除额外的内容并仅提供文件的文件名?对于写入的URL非常有用,但它可以创建文件路径。将其移动到写入的else中。对于一个文件,basename
删除目录,只留下文件名和变量扩展条带麻烦的'.txt'。
试图不要偏离你的代码,但我建议引用变量 - 不应该是URL中的空格,但是〜如果输入错误可能是〜,但主要是因为文件名可能有未转义的空格。
通过使用'echo -e "\nSpidering $directory"'
代替双回波,也可以使得更紧凑。不要以为它们有任何问题,但它们会使我的错误发生。 :P
最后,我建议使用更新的命令替换语法"$(echo "cmd")"
而不是反引号。从技术上讲,这不是错误的,但由于反向弃牌被弃用,他们最终可能会停止工作。而且,更多,所以我会说,它使代码更具可读性,我不得不眯着眼睛告诉它是单引号还是后退。