我用Shotwell把我的照片存储在我的台式电脑上。最近我去了一个长假,想用我的笔记本电脑编辑和整理与Shotwell的照片,所以我把所有的照片都复制到一个外部磁盘上,然后通过Shotwell数据库复制到我的笔记本电脑上。有了适当的符号链接,这一切都工作得很好。虽然一切都没有改变。此时,我还备份了数据库。
然后我想我还是把新的照片导入到我的笔记本电脑的内部硬盘驱动器,以避免我不得不绕着一个外部的硬盘。因此,我分离了外部的照片,当我下一次打开Shotwell时,所有的照片都标记为“丢失”。不出所料。我花了几个月的时间来导入新的照片,并给它们贴上标签,然后进行编辑,只使用Shotwell的外部程序,并将编辑保存为_modified.jpg。一切都进行得很顺利,当我最终重新连接磁盘时,我以为Shotwell会捡起丢失的照片。
令我恐惧的是,我发现事情并没有像我想的那样顺利。当我回到家,重新附上外接磁盘时,Shotwell重新扫描了照片,但失去了对我编辑过的照片的所有参考资料。我已经为这件事提出了一个错误。
我有一个数据库的备份,它正确地包含了我在假期前的所有编辑,还有一个数据库的备份,还有我所有的新编辑。是否有方法合并这些以纠正缺失的编辑?
带回家的信息是:永远有备份!Shotwell有一个错误,当照片丢失时,sqlite数据库"phototable“中记录的"editable_id”字段就会被擦除。恢复自动photos.db.bk很容易修复这个问题,但是如果您继续导入和编辑照片,这将是一个大问题。
发布于 2014-01-31 23:58:14
好吧,我想通了。总的想法是将数据库的新部分复制到旧的数据库中,从而拥有一个完全工作的数据库。在整个过程中,我将“旧”照片/数据库称为移除存储之前工作的照片/数据库,而“新”照片/数据库指的是在某一特定日期(可能有不同的存储位置,或者在删除照片后添加)但“旧”照片不能正常工作的照片/数据库。希望这是有意义的。:)
要使其工作,您需要已经备份了Shotwell数据库。所以我假设你对它的存放位置知道一点。
备份所有东西!我没开玩笑,没人能保证这会起作用。
第一步是安装sqliteman
sudo apt-get install sqliteman之后,使用Sqliteman打开备份Shotwell数据库。然后将其输入到输入框中:
SELECT id, filename, flags FROM phototable;按F9以运行该命令。您应该在滚动框中看到对所有照片的引用。滚动到底部,并验证最后一张照片的“标志”字段为"0“。这表示该文件在Shotwell上一次运行时已存在并正在工作。记下最后一个ID值。我们叫它"phototable_max“吧。
现在,删除前面的命令并运行以下命令:
SELECT id, filepath, flags FROM backingphototable;这显示了你所做的所有编辑。同样,请注意最后一个ID值。叫它"backingphototable_max“。
再次删除该命令并运行以下命令:
SELECT id, name FROM eventtable;您将看到事件列表。再次注意最后一个值。这个是"eventtable_max“。这有点重复,但是现在删除该命令并运行以下命令:
SELECT id, name FROM tagtable;注意最高值。"tagtable_max“。
好的,现在我们有了在Shotwell使用的ID号,然后我们就把它打破了。在这之后,我假设数据库可以工作--也就是说,在备份之后,所有的照片都没有被标记为丢失。
现在将新数据库复制到旧数据库中。
一定要对备份做几次备份。很有可能你会把这件事搞砸。你不想永远失去你的Shotwell数据库。
好,关闭Sqliteman。是时候做些CLI工作了。这里我假设您的旧shotwell数据库位于“~/..local/share/shotwell- old /data/Photo.db”,新数据库位于“~/..local/share/shotwell- new /data/Photo.db”。
sqlite3 ~/.local/share/shotwell-old/data/photo.db现在您将有一个SQLite提示符。为此,请输入:
ATTACH "/home/sean/.local/share/shotwell-new/data/photo.db" AS new;不要忘记;显然,用您的用户名替换"sean“。是的,你必须使用完整的路径。
现在我们只需执行这些命令,你们就完蛋了!您必须用前面提到的值替换_max值。
INSERT INTO phototable SELECT * FROM new.phototable WHERE new.phototable.id > phototable_max;
INSERT INTO backingphototable SELECT * FROM new.backingphototable WHERE new.backingphototable.id > backingphototable_max;
INSERT INTO eventtable SELECT * FROM new.eventtable WHERE new.eventtable.id > eventtable_max;
INSERT INTO tagtable SELECT * FROM new.tagtable WHERE new.tagtable.id > tagtable_max;
DELETE FROM videotable;
INSERT INTO videotable SELECT * FROM new.videotable;我们在这里要做的是从新数据库的工作部分将所有更新的值复制到旧的工作数据库中。最后两行删除,然后复制视频表,在恢复丢失的文件时,视频表本身会很好地排序。
然后按Ctrl+D关闭sqlite3解释器。
现在您可以将photo.db文件移动到Shotwell位置,在“~/..local/share/ Shotwell /data/Photo.db”上打开Shotwell,所有这些都会工作!确保您的硬盘驱动器或外部存储连接这一次。
当我第一次打开它时,我发现Shotwell跑得有点慢,但是它最终重新缓存了所有的东西,然后又开始了。
另外,请注意,我认为,由于我们如何复制标签表和应用于新照片的现有标记将丢失。任何新标签都应该存在,同样地,旧照片上的所有旧标签也会继续存在。这是因为Shotwell存储标签信息的奇怪方式--数据库中的每个标记记录都存储它标记的照片。
https://askubuntu.com/questions/413490
复制相似问题