Linux 非交互式下载

LinuxLinuxBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

欢迎来到这个关于 Linux 非交互式下载的入门实验。对于任何 Linux 用户或系统管理员来说,从命令行高效下载文件的能力是一项必备技能。

在这个实验中,你将学习如何使用 wget 命令,这是一个强大的实用工具,可让你在无需人工干预的情况下从互联网下载文件。当你需要获取多个文件、在后台进行下载,或者在脚本中自动化下载任务时,这个工具特别有用。

在这个实验结束时,你将了解如何使用 wget 通过命令行下载单个文件、重命名下载的文件,以及从列表中下载多个文件,而无需图形界面或交互式提示。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicSystemCommandsGroup(["Basic System Commands"]) linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/FileandDirectoryManagementGroup(["File and Directory Management"]) linux(("Linux")) -.-> linux/PackagesandSoftwaresGroup(["Packages and Softwares"]) linux/BasicSystemCommandsGroup -.-> linux/echo("Text Display") linux/BasicFileOperationsGroup -.-> linux/ls("Content Listing") linux/BasicFileOperationsGroup -.-> linux/cat("File Concatenating") linux/FileandDirectoryManagementGroup -.-> linux/cd("Directory Changing") linux/FileandDirectoryManagementGroup -.-> linux/mkdir("Directory Creating") linux/PackagesandSoftwaresGroup -.-> linux/wget("Non-interactive Downloading") subgraph Lab Skills linux/echo -.-> lab-271439{{"Linux 非交互式下载"}} linux/ls -.-> lab-271439{{"Linux 非交互式下载"}} linux/cat -.-> lab-271439{{"Linux 非交互式下载"}} linux/cd -.-> lab-271439{{"Linux 非交互式下载"}} linux/mkdir -.-> lab-271439{{"Linux 非交互式下载"}} linux/wget -.-> lab-271439{{"Linux 非交互式下载"}} end

环境搭建与基础下载

在第一步中,我们将创建一个工作目录,并学习如何使用 wget 命令下载单个文件。

创建工作目录

首先,我们来创建一个目录,用于存放所有下载的文件。这样可以将文件集中存放在一个位置,便于管理。

导航到项目目录并创建一个名为 download_resources 的新目录:

cd ~/project
mkdir download_resources

理解 wget 命令

wget 命令是一个用于从网络非交互式下载文件的实用工具。其基本语法如下:

wget [选项] [URL]

首次下载

现在,让我们使用 wget 来下载一个文件。我们将下载一个 Python 发行版包作为测试文件:

cd ~/project/download_resources
wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tgz

运行此命令时,你应该会看到类似以下的输出:

--2024-01-10 10:14:51--  https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tgz
Resolving www.python.org (www.python.org)... 151.101.76.223, 2a04:4e42:12::223
Connecting to www.python.org (www.python.org)|151.101.76.223|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 22540566 (21M) [application/octet-stream]
Saving to: 'Python-3.6.1.tgz'

Python-3.6.1.tgz                  100%[=============================================================>]  21.50M  26.8MB/s    in 0.8s

2024-01-10 10:14:52 (26.8 MB/s) - 'Python-3.6.1.tgz' saved [22540566/22540566]

此输出显示了:

  • 正在访问的 URL
  • 服务器的 IP 地址
  • HTTP 响应(200 OK 表示成功)
  • 文件大小(约 21MB)
  • 下载进度
  • 下载速度和时间
  • 确认文件已以其原始名称保存

让我们验证文件是否已正确下载:

ls -lh

你应该会在目录中看到 Python-3.6.1.tgz 文件及其相应的大小。

使用自定义文件名进行下载

在这一步中,我们将探讨如何下载文件并使用自定义文件名保存,而不是使用 URL 中的默认文件名。

使用 -O 选项

-O(大写字母 O,不是数字 0)选项允许你指定输出文件的名称。在以下情况下,这个选项非常有用:

  • 你想要一个更具描述性的文件名
  • URL 中的默认文件名过于复杂
  • 你正在下载同一资源的多个版本

让我们尝试下载另一个 Python 包,但这次我们将使用自定义名称保存它:

cd ~/project/download_resources
wget -O CustomPython.tgz https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tgz

在这个命令中:

  • -O CustomPython.tgz 告诉 wget 将文件保存为 CustomPython.tgz
  • 文件将从指定的 URL 下载,但会以我们的自定义名称保存

输出将与之前类似,但请注意“Saving to”行现在显示的是我们的自定义文件名:

--2024-01-10 10:20:51--  https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tgz
Resolving www.python.org (www.python.org)... 151.101.76.223, 2a04:4e42:12::223
Connecting to www.python.org (www.python.org)|151.101.76.223|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 22676538 (22M) [application/octet-stream]
Saving to: 'CustomPython.tgz'

CustomPython.tgz                  100%[=============================================================>]  21.63M  25.9MB/s    in 0.8s

2024-01-10 10:20:52 (25.9 MB/s) - 'CustomPython.tgz' saved [22676538/22676538]

让我们检查一下文件是否已使用自定义名称下载:

ls -lh

现在你应该在目录中看到原始的 Python-3.6.1.tgz 文件和新的 CustomPython.tgz 文件。

其他有用的选项

在学习 wget 选项时,这里还有一些其他有用的选项:

  • -q(安静模式):抑制输出,适用于脚本
  • -c(继续):恢复部分下载的文件
  • --limit-rate=1m:限制下载速度(例如,限制为每秒 1 兆字节)

例如,要以安静模式下载并使用自定义名称:

wget -q -O PythonQuiet.tgz https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tgz

这个命令不会显示任何输出,但文件会被下载。你可以使用以下命令验证:

ls -lh

现在你应该也能在目录中看到 PythonQuiet.tgz 文件。

从列表中下载多个文件

在实际场景中,你经常需要下载多个文件。手动输入每个 wget 命令会非常低效。幸运的是,wget 可以从列表中下载多个文件,这非常适合自动化操作。

创建包含 URL 的文件

首先,让我们创建一个文本文件,其中包含我们要下载的文件的 URL:

cd ~/project/download_resources
echo "https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz" > download_list.txt
echo "https://www.python.org/ftp/python/3.7.1/Python-3.7.1.tgz" >> download_list.txt
echo "https://www.python.org/ftp/python/3.7.2/Python-3.7.2.tgz" >> download_list.txt

在这些命令中:

  • 第一个 echo 命令创建一个名为 download_list.txt 的新文件,并添加第一个 URL
  • 后续的 echo 命令使用 >>(双重定向)将额外的 URL 追加到文件中

让我们检查文件的内容,确保其正确:

cat download_list.txt

你应该看到三个 URL,每个 URL 占一行:

https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz
https://www.python.org/ftp/python/3.7.1/Python-3.7.1.tgz
https://www.python.org/ftp/python/3.7.2/Python-3.7.2.tgz

使用 wget 读取输入文件

现在,我们可以使用 wget-i 选项从文件中读取 URL 并下载所有文件:

wget -i download_list.txt

这个命令告诉 wgetdownload_list.txt 中读取 URL,并按顺序下载每个文件。你会看到每个下载的输出,类似于下载单个文件时的输出:

--2024-01-10 10:30:51--  https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz
Resolving www.python.org (www.python.org)... 151.101.76.223, 2a04:4e42:12::223
Connecting to www.python.org (www.python.org)|151.101.76.223|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 22808518 (22M) [application/octet-stream]
Saving to: 'Python-3.7.0.tgz'

Python-3.7.0.tgz                  100%[=============================================================>]  21.75M  25.9MB/s    in 0.8s

2024-01-10 10:30:52 (25.9 MB/s) - 'Python-3.7.0.tgz' saved [22808518/22808518]

--2024-01-10 10:30:52--  https://www.python.org/ftp/python/3.7.1/Python-3.7.1.tgz
...

验证下载的文件

下载完成后,让我们验证所有文件是否都已正确下载:

ls -lh Python-3.7.*

你应该看到我们从列表中下载的三个 Python 3.7.x 文件:

-rw-r--r-- 1 labex labex 22M Jan 10 10:30 Python-3.7.0.tgz
-rw-r--r-- 1 labex labex 22M Jan 10 10:30 Python-3.7.1.tgz
-rw-r--r-- 1 labex labex 22M Jan 10 10:31 Python-3.7.2.tgz

创建批量下载脚本

为了方便以后使用,让我们创建一个简单的 shell 脚本,用于从列表中下载文件。这展示了如何在自动化操作中使用 wget

cd ~/project/download_resources
nano batch_download.sh

在文件中输入以下内容:

#!/bin/bash
## A simple script to download files from a list
if [ -f "$1" ]; then
  echo "Downloading files from list: $1"
  wget -i "$1"
else
  echo "Error: File $1 not found"
  exit 1
fi

Ctrl+O 保存文件,然后按 Enter,再按 Ctrl+X 退出。

使脚本可执行:

chmod +x batch_download.sh

现在,你可以在将来使用这个脚本从任何列表中下载文件:

./batch_download.sh download_list.txt

这个命令的功能与我们之前的 wget -i download_list.txt 命令相同,但它被封装在一个脚本中,你可以重复使用。

总结

在本次实验中,你学习了如何在 Linux 中使用 wget 命令进行非交互式下载。现在你具备以下技能:

  • 使用基本的 wget 命令下载单个文件
  • 使用 -O 选项以自定义名称保存下载的文件
  • 创建 URL 列表,并使用 -i 选项一次性下载多个文件
  • 创建简单的自动化脚本进行批量下载

这些技能对于系统管理员、开发者以及任何需要从命令行高效下载文件的 Linux 用户来说都非常有价值。非交互式下载在自动化操作、远程服务器管理以及没有图形界面的场景中尤其有用。

你可以自行探索 wget 的其他一些特性,包括:

  • 使用 -r 进行递归下载,用于镜像网站
  • 使用 -b 在后台进行长时间下载
  • 使用 --user--password 进行身份验证,以访问受保护的资源
  • 设置超时时间、重试次数和其他连接参数

有了这些功能,你可以在 Linux 命令行上高效地处理各种下载场景。