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

如何将文件更改为目录? find+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

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

有什么办法可以恢复这2000个文件吗?或者有什么方法可以将此文件转换2020-01-07为目录2020-01-07并让我的数据返回?

答案1

在目标路径末尾添加斜杠/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

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

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

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

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

相关内容