我是不是用 find -exec mv 删除了所有内容?

jtn*_*hou 26 command-line find

我试图自己解决这个问题。这是我在终端中使用的命令:

find . -name "*.jpg" -exec mv {} pictures \;
Run Code Online (Sandbox Code Playgroud)

我没有先创建一个名为图片的目录。发生的事情是创建了一个名为pictures.gif 的文件。它是否找到文件然后在移动它们时覆盖它们?

由于此命令而创建的这个pictures.gif 文件是什么?

文件是否仍然可能在驱动器上的某个地方?

Gil*_*il' 45

第一:立即停止使用此驱动器。以只读方式重新挂载它是可以的,只要确保不要再写了。是的,你已经删除了图片。它们可能是可恢复的,但是您使用该驱动器的次数越多,恢复任何内容的机会就越小。

您的命令运行mv pic1.jpg picturesmv pic2.jpg pictures等。每次调用都会mv覆盖当前pictures由另一张图片命名的文件。

移动文件(在同一文件系统内)意味着将它从包含它的目录中分离出来,并将它附加到新名称下的目标目录。所以这个命令没有修改或删除文件数据,只有已经消失的图像的目录条目。

您可以运行一个工具来搜索文件系统的可用空间并查找类似于 jpeg 的内容。幸运的是,每个 jpeg 文件都以可识别的标题开头。查找已删除内容的工具称为雕刻工具。Ubuntu 中有一些,包括recoveryjpegforemosttestdisk,...如果照片位于单独的主分区或外部驱动器上,请安装其中一个或多个软件包并将它们指向包含已删除图片的分区。

如果照片在您的系统盘上,您需要立即停止使用您的系统。使用另一台计算机下载 Live CD 或 USB 并从中启动。任何包含 testdisklive CD 都应该符合要求,但有些比其他更容易使用。System Rescue CD是一个很好的通用系统救援CD。对于 Ubuntu 用户来说,Ubuntu Rescue Remix可能更熟悉。


为了将来参考,mv -i除非您打算覆盖文件,否则请养成使用的习惯。您可能已经有了 的别名mv,但只有在您mv直接在命令行上键入时才会起作用,而不会在mv脚本或find命令调用时起作用。

$ : >pictures
$ mv -i foo.jpg pictures
mv: overwrite `pictures'?
Run Code Online (Sandbox Code Playgroud)

此外,如果您/在应该是目录名称的名称之后添加 a,那么如果该目录不存在,或者该名称的文件不是目录,您将收到错误消息。

$ : >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
Run Code Online (Sandbox Code Playgroud)

为了避免 的陷阱find,您可以改用 bash 的递归目录遍历功能。您需要先使用命令将其打开shopt -s globstar(您可以将此行添加到您的~/.bashrc. 然后:

mv **/*.jpg pictures/
Run Code Online (Sandbox Code Playgroud)

(请注意,在 bash 中,**/还会遍历指向目录的符号链接,并且无法将其关闭。如果您想要不通过指向目录的符号链接的递归遍历,请使用 zsh 或 find。)


Lek*_*eyn 13

恐怕您刚刚将所有图片都丢失到了该单个文件中。可以使用像foremost这样的取证工具恢复某些文件,但是使用媒体(磁盘)的时间越长,成功率就越低。(准确地说,分区安装的时间越长。)

下次,当您指的是目录时,-i请为其添加斜杠并添加选项以在文件已存在的情况下要求确认:

find -name "*.jpg" -exec mv -i {} pictures/ {} \;
Run Code Online (Sandbox Code Playgroud)

  • 是的,我必须再次强调:**立即进入实时 CD 环境!** 如果您想要恢复这些文件,您需要立即停止使用该驱动器。如果您需要下载和刻录映像,请从另一台计算机上进行。此磁盘上发生的活动越少,您的照片就越有可能被恢复。 (6认同)