web-dev-qa-db-ja.com

ファイルをディレクトリに変更するにはどうすればよいですか? 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

しかし、宛先パスの最後に/を追加するのを忘れました。したがって、上記のコマンドが行ったことは、2020-01-07という名前のファイルを作成し、バイナリコンテンツを書き込んだため、現在は読み取ることができません。そして私の2000ファイルはなくなった。この2020-01-07ファイルのサイズは220 KBです。しかし、これらの2000ファイルの合計サイズは約1 GBでした。

これらの2000ファイルを復元する方法はありますか?または、このファイルを2020-01-07からディレクトリ2020-01-07に変換して、データを戻す方法はありますか?

17
Sanket Mehta

/opt/alfresco/archived/2020-01-07ディレクトリが明らかに存在しないため、宛先パス2020-01-07の末尾にスラッシュを追加すると、mvコマンドがエラーになります。これでファイルが保存されます。

/opt/alfresco/archived/2020-01-07が既存のディレクトリであった場合(宛先パスの末尾にスラッシュがあるかどうかに関係なく)、ファイルはそのディレクトリに移動された場合にも保存されます(ファイル名の衝突がまだ発生する可能性があります)ただし、ファイルを複数のディレクトリから単一のディレクトリに移動すると、問題が発生します)。これがあなたがやりたかったことです。忘れていたのは、最初にそのディレクトリを作成することでした。

ここで、ディレクトリが存在しなかったため、findコマンドが実行したのは、個々のXMLとPDFファイルを取得し、/opt/alfresco/archived/2020-01-07に名前を変更してから、前のファイルを上書きする次のファイル。

ファイル/opt/alfresco/archived/2020-01-07最後のXMLまたはPDF findで見つかったファイル)になりました。

/opt/alfresco全体でfindコマンドを実行したので、PDFまたは/opt/alfresco/archivedの下のディレクトリなど、そのパスの下にあるXMLファイルは、同じ運命。

これはとても簡単なエラーです。失われたファイルをバックアップから復元する以外に、失われたファイルを回復する便利な方法はありません。

データのバックアップを1時間ごとに作成しない場合、これは、それを検討するための開始点として適切な場合があります。個人ファイルのバックアップを行う場合は、resticまたはborgbackupをお勧めします。これは、ある種のオフサイトまたは少なくとも外部ストレージに対して行うことが望ましいです。

次の質問と回答が役立つ場合があります。

このスクリプトの次の書き換えでは、archivedサブディレクトリを無視して、mv -n -tを使用することができます。また、findは場所を出力しないため、見つかったファイルを明示的に-printする(またはmv -vを使用する)必要があります。

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

知っておくと便利なコメント(下)のいくつかのこと:

  • GNU mv-t targetで使用されている場合、targetがディレクトリでない場合は失敗します。-exec mv -t /opt/alfresco/archived/2020-01-07 {} +を使用して、findで一度に複数のファイルを移動します(これにより、操作もスピードアップします)。

  • GNU mv-nと共に使用すると、既存のファイルの上書きが拒否されます。

  • -t-nも標準ではありません(ただし、macOSとFreeBSDには-nもあります)。ただし、システム間で移植する必要のないスクリプトでそれらを使用することを妨げるものではありません。 。

50
Kusalananda