我想编写一个脚本,从 URL 下载档案(使用wget
)并提取该档案(例如使用atool
,请参阅这里)。
不幸的是,我不知道wget
下载的文件保存在哪里。我的脚本是通过 URL 参数化的,所以我在编写脚本时不知道 URL。
如果我不知道保存到的wget
位置,如何提取通过 下载的文件wget
?请注意,我要提取下载的文件,因此文件扩展名可能很重要。
一般来说,很难/不可能预测wget
保存的位置。举几个例子,
wget example.com
创建文件index.html
- 第二次运行
wget example.com
将创建文件index.html.2
wget http://dis.images.s3.amazonaws.com/105024.jpeg
创建文件105024.jpeg
wget "https://go.microsoft.com/fwlink/?LinkID=760868"
创建文件index.html?LinkID=760868
wget --content-disposition "https://go.microsoft.com/fwlink/?LinkID=760868"
创建文件code_1.19.1-1513676564_amd64.deb
答案1
首先将wget
输出保存到临时文件。看一下mktemp
,它可以让您以安全的方式创建临时文件:
[~]$ filename=$(mktemp)
[~]$ echo $filename
/tmp/tmp.DglaA1x2Z0
[~]$ wget -O $filename www.example.com
--2017-12-29 22:15:28-- http://www.example.com/
Resolving www.example.com (www.example.com)... 93.184.216.34, 2606:2800:220:1:248:1893:25c8:1946
Connecting to www.example.com (www.example.com)|93.184.216.34|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1270 (1.2K) [text/html]
Saving to: ‘/tmp/tmp.DglaA1x2Z0’
100%[======================================>] 1,270 --.-K/s in 0s
2017-12-29 22:15:30 (156 MB/s) - ‘/tmp/tmp.DglaA1x2Z0’ saved [1270/1270]
mktemp
保证文件名是唯一的,并且权限得到处理,这样我们就不会最终写入其他用户拥有的文件。该文件由mktemp
具有安全权限的用户创建:
[~]$ ls -la $filename
-rw------- 1 vidarlo users 1270 Aug 10 2013 /tmp/tmp.DglaA1x2Z0
这样,您将拥有一个保证不会被用于任何事情的文件名,并且您确定不会受到竞争条件的影响,因为另一个用户诱骗您写入文件并造成灾难性的后果。
现在您有一个具有确定文件名的文件,您可以运行file
来确定它是什么类型的档案:
[/tmp]$ file -i foo.tar
foo.tar: application/x-tar; charset=binary
[/tmp]$ file -i foo.7z
foo.7z: application/x-7z-compressed; charset=binary
这不依赖于远程服务器告诉我们的内容。服务器可以告诉您扩展名 - 或者不告诉您。php 脚本可以提供完全有效的 tar 存档,而无需告诉您它是 tar 存档。
此外,我们将内容保存到安全的地方,避免竞争条件。
使用这种方法支持大量的档案格式可能会变得很麻烦,但它肯定比简单地使用来自网络服务器的文件扩展名来为我们提供档案要好。
请注意绝不 解析 ls因为它可能会产生很多意想不到的后果。
答案2
默认情况下,wget
保存到.
目录。但是,您可以使用-P
或--directory-prefix
选项覆盖此设置。因此,要将文件保存到/tmp/some_folder
,您可以使用wget ... -P tmp/some_folder ...
。“技巧”是理解所使用的正确术语(前缀似乎不是特别直观)。
使用的详细信息wget
可以在man wget
命令本地找到,或者在线。