我想编写一个 bash 脚本来下载并安装最新的每日程序版本 (RStudio)。是否可以让 wget
只下载目录 http://www.rstudio.org/download/daily/desktop/ 中的最新文件?
最佳答案
这些文件似乎按发布日期排序,每个新版本都是一个新条目,新名称反射(reflect)了版本号的变化,因此检查某个文件的时间戳似乎没有必要。
此外,您还提供了一个指向“目录”的链接,该链接本质上是一个网页。 AFAIK,http 中没有目录这样的东西(这是一种在给定地址为您提供数据的通信协议(protocol))。您看到的是由服务器生成的列表,它类似于 windows 文件夹以方便使用,尽管它仍然是一个网页。
话虽如此,您可以抓取该网页。以下代码在列表的第一个位置下载文件(假设第一个是最新的):
#!/bin/bash
wget -q -O tmp.html http://www.rstudio.org/download/daily/desktop/ubuntu64/
RELEASE_URL=`cat tmp.html | grep -m 1 -o -E "https[^<>]*?amd64.deb" | head -1`
rm tmp.html
# TODO Check if the old package name is the same as in RELEASE_URL.
# If not, then get the new version.
wget -q $RELEASE_URL
现在,您可以根据本地最新版本进行检查,并在必要时进行安装。
编辑:更新版本,它进行简单的版本检查并安装包。
#!/bin/bash
MY_PATH=`dirname "$0"`
RES_DIR="$MY_PATH/res"
# Piping from stdout suggested by Chirlo.
RELEASE_URL=`wget -q -O - http://www.rstudio.org/download/daily/desktop/ubuntu64/ | grep -m 1 -o "https[^\']*"`
if [ "$RELEASE_URL" == "" ]; then
echo "Package index not found. Maybe the server is down?"
exit 1
fi
mkdir -p "$RES_DIR"
NEW_PACKAGE=${RELEASE_URL##https*/}
OLD_PACKAGE=`ls "$RES_DIR"`
if [ "$OLD_PACKAGE" == "" ] || [ "$OLD_PACKAGE" != "$NEW_PACKAGE" ]; then
cd "$RES_DIR"
rm -f $OLD_PACKAGE
echo "New version found. Downloading..."
wget -q $RELEASE_URL
if [ ! -e "$NEW_PACKAGE" ]; then
echo "Package not found."
exit 1
fi
echo "Installing..."
sudo dpkg -i $NEW_PACKAGE
else
echo "rstudio up to date."
fi
还有一些评论:
res/
目录与最新版本(正好是一个文件)并将其名称与新抓取的包名称进行比较。
这是肮脏的(拥有文件并不意味着它已经
过去成功安装)。最好解析一下
dpkg -l
的输出,但包的名称可能略有不同不同于刮的。
sudo
的密码,所以它不会是 100% 自动的。有几个解决这个问题的方法,虽然没有监督你可能会遇到
前面提到的问题。
关于linux - 如何获取目录的最新文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15040132/