如何将文件更改为目录?find+mv 后文件丢失

San*_*hta 17 linux find data-recovery command mv

我有一个包含大约 2000 个文件的目录。
我运行以下命令将这 2000 个文件移动到目标目录中:

find /opt/alfresco \
        -type f \( -iname \*.pdf -o -iname \*.xml \) \
        -exec mv {} /opt/alfresco/archived/2020-01-07  \; > /opt/alfresco/scripts/move.log
Run Code Online (Sandbox Code Playgroud)

但是,我忘了/在目标路径的末尾附加一个。所以上面的命令所做的是,它创建了一个带有名称的文件,2020-01-07并向其中写入了一些现在不可读的二进制内容。我的 2000 个文件不见了。此2020-01-07文件的大小为 220 KB。但那 2000 个文件的总大小约为 1 GB。

有什么办法可以恢复那 2000 个文件吗?或者我可以通过什么方式将此文件转换2020-01-072020-01-07我的数据返回的目录?

Kus*_*nda 50

在目标路径的末尾添加斜杠/opt/alfresco/archived/2020-01-07会使mv命令出错,因为该2020-01-07目录显然不存在。这将保存您的文件。

如果它们/opt/alfresco/archived/2020-01-07是现有目录(无论目标路径末尾是否有斜杠),它们也会被保存,并且您的文件将被移动到该目录中(尽管文件名冲突可能仍然是一个问题,当您将文件从多个目录移动到单个目录时)。这就是你想要做的。您忘记做的是首先创建该目录。

现在,由于目录不存在,该find命令所做的是获取每个单独的 XML 和 PDF 文件,将其重命名为/opt/alfresco/archived/2020-01-07,然后继续对下一个文件执行相同操作,覆盖前一个文件。

该文件/opt/alfresco/archived/2020-01-07现在是由 找到的最后一个 XML 或 PDF 文件find

另请注意,由于您在 上运行find命令/opt/alfresco,因此该路径下的任何 PDF 或 XML 文件(例如在 下的任何目录中/opt/alfresco/archived)都会遇到相同的命运。

这是一个很容易犯的错误。除了从备份中恢复丢失的文件之外,没有其他方便的方法可以恢复丢失的文件。

如果您不每小时备份数据,这可能是开始考虑这样做的好时机。我会推荐resticborgbackup备份个人文件,最好是针对某种异地或至少是外部存储。

以下问题和答案可能会有所帮助:

在您下次重写此脚本时,您可能希望忽略archived子目录,并使用mv -n -t. 您还需要明确-print找到的文件(或使用mv -v),find否则不会输出它们的位置:

find /opt/alfresco \
    -path /opt/alfresco/archived -prune -o \
    -type f \( -iname '*.pdf' -o -iname '*.xml' \) \
    -exec mv -n -t /opt/alfresco/archived/2020-01-07 {} + \
    -print >/opt/alfresco/scripts/move.log
Run Code Online (Sandbox Code Playgroud)

评论(下面)中的一些可能有用的信息:

  • 如果 GNUmv与 一起使用-t target,如果target不是目录,它将失败。您将使用-exec mv -t /opt/alfresco/archived/2020-01-07 {} +一次移动多个文件find(这也会加快操作速度)。

  • 如果 GNUmv与 一起使用-n,它将拒绝覆盖现有文件。

  • 既不是标准的-t也不-n是标准的(macOS 和 FreeBSD 也有-n),但这不应该阻止您在不需要在系统之间移植的脚本中使用它们。