在整理旧网站、备份博客图片、迁移 WordPress 站点素材时,经常会遇到一个问题:
用命令行下载图片以后,本地文件的时间会不会变成“下载时间”?有没有办法尽量保留图片原来的时间属性?

答案是:可以,但要看你说的“原始时间”具体指什么。

对于 wget 来说,它能够保留的主要是服务器返回的文件修改时间,也就是 HTTP 响应头里的 Last-Modified 时间。只要服务器正确提供这个时间,wget 就可以把本地文件的修改时间设置成服务器上的时间。

但是,wget 并不能保证恢复图片真正的拍摄时间,也不能保证恢复 WordPress 后台里的上传时间。它只是尽量保留“远程文件的修改时间”。


一、最核心的参数:-N

wget 中和时间戳有关的核心参数是:

wget -N "图片地址"

-N--timestamping 的简写,意思是启用时间戳检查。

例如下载一张图片:

wget -N "https://example.com/wp-content/uploads/2024/05/photo.jpg"

如果服务器返回了这张图片的 Last-Modified 信息,wget 下载后会把本地文件的修改时间设置成这个远程时间,而不是单纯使用当前下载时间。


二、批量下载图片时也可以保留时间

如果有一个图片地址列表,例如 urls.txt

https://example.com/wp-content/uploads/2024/05/photo01.jpg
https://example.com/wp-content/uploads/2024/05/photo02.jpg
https://example.com/wp-content/uploads/2024/06/photo03.png

可以这样批量下载:

wget -N -i urls.txt

这里:

-N

表示保留远程时间戳;

-i urls.txt

表示从 urls.txt 文件中读取下载地址。

这是比较干净、稳定的批量下载方式,适合先从网页或 WordPress 媒体库中提取图片地址,再统一下载。


三、下载整个页面中的图片

如果只是想下载某个网页中用到的图片,可以使用:

wget -p -N -nd -A jpg,jpeg,png,gif,webp,avif "https://example.com/about/"

这条命令的含义是:

-p      下载页面显示所需资源
-N 启用时间戳,尽量保留服务器文件时间
-nd 不创建多层目录,所有文件放在当前目录
-A 只接受指定后缀的图片文件

例如:

mkdir page-images
cd page-images

wget -p -N -nd -A jpg,jpeg,png,gif,webp,avif "https://example.com/about/"

这样会把页面中引用到的图片下载下来,并尽量保留远程文件时间。

不过这种方式有一个缺点:它下载的是“页面需要显示的资源”,不一定只包含你想要的原图。有些网站会引用 logo、背景图、按钮图、缩略图等,这些也可能一起被下载下来。


四、WordPress 图片需要注意缩略图问题

WordPress 会自动生成多种尺寸的图片,例如:

photo.jpg
photo-150x150.jpg
photo-300x200.jpg
photo-768x512.jpg
photo-1024x683.jpg

其中:

photo.jpg

通常是原图或接近原图的文件;

而:

photo-150x150.jpg
photo-768x512.jpg

这类带有尺寸后缀的文件,通常是 WordPress 自动生成的缩略图或中等尺寸图片。

如果只想下载原图,可以在整理 URL 列表时排除这种格式。比如:

grep -Ev -- '-[0-9]+x[0-9]+\.(jpg|jpeg|png|webp)$' urls.txt > original-images.txt

然后再下载:

wget -N -i original-images.txt

这样可以减少把各种缩略图都下载下来的情况。


五、如何确认服务器是否提供了时间信息?

wget -N 能不能生效,关键看服务器有没有返回 Last-Modified

可以用下面的命令检查:

wget --server-response --spider "https://example.com/wp-content/uploads/2024/05/photo.jpg"

如果返回信息里有类似这样的内容:

Last-Modified: Tue, 14 May 2024 08:30:12 GMT

那么 wget -N 就有依据把本地文件时间设置成这个时间。

如果没有 Last-Modified,那 wget 就无法知道远程文件原来的修改时间。此时下载下来的文件通常会使用当前下载时间。


六、下载后如何确认文件时间?

下载完成后,可以用:

stat photo.jpg

或者:

ls -l --time-style=full-iso

例如:

ls -l --time-style=full-iso *.jpg

可以看到每个文件的修改时间。

如果时间显示的不是当前下载时间,而是过去某个服务器上的时间,说明 wget -N 起作用了。


七、wget -N 保留的不是 EXIF 拍摄时间

这一点很重要。

图片文件里可能有 EXIF 信息,例如照片拍摄时间、相机型号、GPS 信息等。
wget 下载文件时不会主动修改这些 EXIF 信息,只要服务器上的图片本身包含 EXIF,下载回来后一般仍然会保留。

但是,wget -N 设置的是文件系统里的修改时间,不是 EXIF 里的拍摄时间。

两者不是一回事。

例如一张照片可能有:

拍摄时间:2021-04-10 15:20:30
服务器修改时间:2024-05-14 08:30:12
本地下载时间:2026-05-17 16:00:00

使用:

wget -N "图片地址"

以后,本地文件修改时间更可能变成:

2024-05-14 08:30:12

而不是:

2021-04-10 15:20:30

如果想把文件修改时间改成照片 EXIF 拍摄时间,需要使用 exiftool

例如:

exiftool '-FileModifyDate<DateTimeOriginal' photo.jpg

批量处理:

find . -type f \( -iname "*.jpg" -o -iname "*.jpeg" \) \
-exec exiftool '-FileModifyDate<DateTimeOriginal' {} \;

八、比较推荐的实际流程

如果目标是备份一个 WordPress 页面或网站里的图片,比较稳妥的流程是:

第一步,提取图片地址,保存成 urls.txt

第二步,排除 WordPress 缩略图:

grep -Ev -- '-[0-9]+x[0-9]+\.(jpg|jpeg|png|webp)$' urls.txt > original-images.txt

第三步,使用 wget -N 下载:

mkdir images
cd images

wget -N -i ../original-images.txt

第四步,检查文件时间:

ls -l --time-style=full-iso

如果还想按照 EXIF 拍摄时间整理,再使用:

exiftool '-FileModifyDate<DateTimeOriginal' *.jpg

九、结论

wget 可以保留图片的原始时间属性,但这个“原始时间”要准确理解。

它能保留的是:

服务器返回的 Last-Modified 文件修改时间

推荐命令是:

wget -N "图片地址"

批量下载时:

wget -N -i urls.txt

但它不能保证保留或恢复:

照片拍摄时间
WordPress 上传时间
本地文件创建时间

如果只是想尽量让下载下来的图片保持网站服务器上的时间状态,wget -N 就足够了。
如果想按照照片真正拍摄时间整理文件,则需要在下载后配合 exiftool 处理。

Leave a Reply

Your email address will not be published. Required fields are marked *