使用curl命令将文件保存到特定文件夹

313
在一个 shell 脚本中,我想从某个 URL 下载一个文件并将其保存到指定的文件夹中。使用 curl 命令下载文件时,我应该使用哪个特定的 CLI 标志才能将文件下载到特定的文件夹中?如果不能使用该标志,还有其他方法可以实现这个目标吗?

只需在curl命令周围包装两个额外的命令:pushd <path>; curl ...; popd; - Sławomir Lenart
9个回答

422

我认为你不能直接给curl一个路径,但你可以转到该位置,下载并返回。

cd target/path && { curl -O URL ; cd -; }

或者使用子shell。

(cd target/path && curl -O URL)

只有当路径存在时,两种方式才会下载。 -O 保留远程文件名。下载后,它将返回到原始位置。

如果需要显式设置文件名,可以使用小写的 -o 选项:

curl -o target/path/filename URL

2
我有这个命令:curl -LOk basename /packages "http://github.com/ziyaddin/xampp/archive/master.zip"。但它说文件名错误 --> basename /packages - Ziyaddin Sadigov
13
你也可以使用子Shell,像这样:(cd 目标路径; curl -O URL) - Ehtesh Choudhury
10
这两者有何不同?第一种会进入一个目录并下载文件,然后退出该目录。第二种则停留在当前目录,并将文件通过curl命令下载到指定位置。第二种方法似乎更简单。 - hzhu
10
在第一个示例中,文件名是从服务器上的文件名派生而来。在第二个示例中,您正在将您下载的内容重命名为您提供的名称。 - turtlemonvh
4
我希望有一个选项可以指定目录,但使用服务器上的文件名。目前似乎使用 cd 是最好的选择,尽管有点不太优雅。 - StockB
2
如果你在一个脚本中,你可以这样做: for url in $(cat urllistFile ) ; do name=$(basename $url) ; curl -o [yourDir]/$name $url ; done - PaulRM

95

curl 7.73.0自从推出,就可以使用--output-dir选项:

curl --create-dirs -O --output-dir /tmp/receipes https://example.com/pancakes.jpg

12
很遗憾,自从版本7.73.0还没有为Ubuntu准备好,因此这些选项不可用。 - Zorono
2
尽管在Ubuntu上仍无法运行- curl版本令人遗憾地为20.04 LTS的7.68.0-但我可以确认它在OSX Monterey上可以运行,因此值得点赞。 - F1Linux
在Ubuntu Server 20.04上,curl 7.68.0 存在 --create-dirs 但不存在 --output-dir - Manuel Jordan
也适用于Windows操作系统。 - feelthhis
4
它在Ubuntu 22.04上与curl 7.81.0很好地运行。 - Richard

28

curl 没有这个选项(不指定文件名的情况下),但 wget 有。目录可以是相对路径或绝对路径。此外,如果目录不存在,它将自动被创建。

wget -P relative/dir "$url"

wget -P /absolute/dir "$url"

11

对我而言它能工作:

curl http://centos.mirror.constant.com/8-stream/isos/aarch64/CentOS-Stream-8-aarch64-20210916-boot.iso --output ~/Downloads/centos.iso 

其中:

--output 允许我设置想要放置的文件路径和命名以及扩展名。


7

使用重定向:

使用重定向可以将 curl 下载的文件放置到指定路径中:

curl https://download.test.com/test.zip > /tmp/test.zip

显然,“test.zip”是您想要为重定向的文件标记的任意名称-可以是相同的名称或不同的名称。

实际上,我更喜欢@oderibas的解决方案,但在您的发行版支持curl版本7.73.0或更高版本之前,这将使您绕过该问题。


5

对于Windows中的PowerShell,您可以将相对路径文件名添加到--output标志中:

curl -L  http://github.com/GorvGoyl/Notion-Boost-browser-extension/archive/master.zip --output build_firefox/master-repo.zip

这里的 build_firefox 是相对路径。


2
使用wget命令
wget -P /your/absolut/path "https://jdbc.postgresql.org/download/postgresql-42.3.3.jar"

0

这里有一个使用批处理创建安全文件名并将其保存到名为tmp/的文件夹中的示例。我认为在Windows或Linux Curl版本中没有此选项很奇怪。

@echo off
set url=%1%

for /r %%f in (%url%) do (
    set url=%%~nxf.txt
    curl --create-dirs -L -v -o tmp/%%~nxf.txt %url%
)

以上批处理文件将接受单个输入,即URL,并从该URL创建文件名。如果未指定文件名,则将保存为tmp/.txt。因此,它并非全部为您完成,但在Windows中完成了工作。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接