问题描述
我试图自己解决这个问题。这是我在终端中使用的命令:
find . -name "*.jpg" -exec mv {} pictures \;
我没有首先创建一个名为Pictures的目录。发生的事情是创建了一个名为pictures.gif的文件。它是否找到文件然后在移动文件时将其覆盖?
通过此命令创建的pictures.gif文件是什么?
文件仍然可能在驱动器上的某个位置吗?
最佳解决方法
首先:立即停止使用该驱动器。可以重新安装read-only,只需确保不要再进行任何编写。是的,您已经删除了图片。它们可能是可恢复的,但是您继续使用该驱动器的次数越多,恢复任何内容的机会就越少。
您的命令运行了mv pic1.jpg pictures
,mv pic2.jpg pictures
等。每次调用mv
都会用另一张图片覆盖当前名为pictures
的文件。
移动文件(在同一文件系统中)意味着将其从包含该文件的目录中分离出来,并以新名称附加到目标目录中。因此,此命令不会修改或删除任何文件数据,只有已消失图像的目录条目。
您可以运行一个工具来搜索文件系统的可用空间,并查找类似于jpegs的内容。幸运的是,每个jpeg文件都以可识别的标头开头。查找已删除内容的工具称为雕刻工具。在Ubuntu中有一些,包括recoverjpeg,foremost,testdisk……如果照片位于单独的主分区或外部驱动器上,请安装一个或多个这些软件包并将它们指向带有已删除图片的分区。
如果照片在系统磁盘上,则需要立即停止使用系统。使用另一台计算机下载实时CD或USB并从中启动。任何live CDs that include testdisk都可以满足要求,但有些比其他的更易于使用。 System Rescue CD是一个不错的general-purpose系统救援CD。对于Ubuntu用户,Ubuntu Rescue Remix可能更熟悉。
供以后参考,养成使用mv -i
的习惯,除非您打算覆盖文件。您可能已经具有mv
的别名,但是只有在您直接在命令行上键入mv
时,别名才会出现,而不是通过脚本或find
命令调用mv
时。
$ : >pictures
$ mv -i foo.jpg pictures
mv: overwrite `pictures'?
另外,如果将/
放在本应作为目录名称的名称之后,如果该目录不存在或者该名称的文件不是目录,则会收到错误消息。
$ : >pictures
$ mv foo.jpg pictures/
mv: cannot move `foo.jpg' to `pictures/': Not a directory
$ rm pictures
$ mv foo.jpg pictures/
mv: cannot move `foo.jpg' to `pictures/': Not a directory
为了避免find
的陷阱,您可以改用bash的递归目录遍历功能。您需要首先使用命令shopt -s globstar
将其打开(您可以将此行添加到~/.bashrc
中。然后:
mv **/*.jpg pictures/
(请注意,在bash中,**/
还会遍历目录的符号链接,并且无法将其关闭。如果您希望递归遍历不能通过目录的符号链接进行查看,请使用zsh或find。)
次佳解决方法
恐怕您刚刚将所有图片丢失到了单个文件中。最可能对recover some files using forensic tools如此,但是使用介质(磁盘)的时间越长,成功率就会下降。 (确切地说,分区的安装时间越长。)
下次,当您指的是目录时,请在其中添加斜杠并添加-i
选项,以在文件已存在的情况下请求确认:
find -name "*.jpg" -exec mv -i {} pictures/ {} \;