在整理旧网站、备份博客图片、迁移 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 处理。