Skip to content
MagickCmd报错 › mogrify 把我的原图覆盖了

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

本站生成器的批量模式产出的就是这种写法,原因正是如此。

几个值得养成的习惯

  1. 先拿一个文件试。 magick sample.jpg -resize 800x600 test.jpg,看一眼结果,再放开跑。
  2. 任何就地操作前先复制一份文件夹。 cp -r photos photos-backup 只要几秒钟。
  3. 优先用 magick 加循环,而不是 mogrify。 多敲几个字正是它的价值 —— 它逼你写出输出路径。
  4. 当心通配符的范围。 在错误的目录里执行 *.jpg,或者 ** 递归得比你以为的更深,会把一个小失误变成大事故。

试运行

mogrify 没有 dry-run 参数。但你可以先看看它会碰哪些文件:

ls *.jpg | head -50
ls *.jpg | wc -l

如果这个数字比你预期的大,说明通配符写错了 —— 在执行之前发现,而不是之后。


相关页面

Copied