mogrify 把我的原图覆盖了
mogrify 的设计就是就地写入,没有撤销。有哪些恢复可能,以及 -path、循环、mogrify -format 这些永远不动原文件的安全写法。
mogrify 是就地修改文件的。这就是它存在的意义,也是大家用 ImageMagick 弄丢整个照片文件夹最常见的方式:
mogrify -resize 800x600 *.jpg # 所有原图现在都是 800x600 了
如果刚刚发生
先停止往那块磁盘写入。然后按可能性从高到低试:
- Time Machine、文件历史记录,或任何备份。 最该先查的。
- 云同步的版本历史。 Dropbox、Google Drive、OneDrive 和 iCloud 都保留 30 天以上的历史版本,而
mogrify在它们看来就是一次普通编辑。这条救回的文件夹比列表上其他所有加起来都多。 - 照片可能还在相机或手机里。 如果你以为已经导入完了,很容易忘掉这一条。
- 文件系统快照。 ZFS、Btrfs、LVM,或者开了快照的 NAS。
- 数据恢复工具。
photorec之类有时能捞回旧的数据块,但前提是之后几乎没有新的写入。SSD 开了 TRIM 的话希望不大。
说句实话:如果以上都不适用,原图就是没了。mogrify 是覆盖而不是删除,所以回收站里也没有。
mogrify 的安全用法
写到另一个目录
mkdir out
mogrify -path out -resize 800x600 *.jpg
-path 让 mogrify 写进指定目录而不是覆盖源文件。这个目录必须事先存在 —— mogrify 不会自己创建,目录不存在的话你又回到了覆盖模式。
改格式,这会写出新文件
mogrify -format webp -quality 80 *.jpg
用了 -format,mogrify 会在 photo.jpg 旁边写一个 photo.webp,原文件不动。两个一起用最保险:
mkdir out
mogrify -path out -format webp -quality 80 *.jpg
或者干脆不用 mogrify
写个循环也没长多少,而且输出路径是明确的 —— 按回车之前你就能看清文件要去哪儿:
mkdir -p out
for f in *.jpg; do
magick "$f" -resize 800x600 "out/$f"
done
本站生成器的批量模式产出的就是这种写法,原因正是如此。
几个值得养成的习惯
- 先拿一个文件试。
magick sample.jpg -resize 800x600 test.jpg,看一眼结果,再放开跑。 - 任何就地操作前先复制一份文件夹。
cp -r photos photos-backup只要几秒钟。 - 优先用 magick 加循环,而不是 mogrify。 多敲几个字正是它的价值 —— 它逼你写出输出路径。
- 当心通配符的范围。 在错误的目录里执行
*.jpg,或者**递归得比你以为的更深,会把一个小失误变成大事故。
试运行
mogrify 没有 dry-run 参数。但你可以先看看它会碰哪些文件:
ls *.jpg | head -50
ls *.jpg | wc -l
如果这个数字比你预期的大,说明通配符写错了 —— 在执行之前发现,而不是之后。