ファイルをディレクトリに変更するには? 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サイズは220KBです。ただし、この2000ファイルの合計サイズは約1GBです。

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

ベストアンサー1

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

/opt/alfresco/archived/2020-01-07既存のディレクトリの場合(ターゲットパスの末尾にスラッシュがあるかどうかにかかわらず)、そのディレクトリも保存され、ファイルはそのディレクトリに移動されます(ファイルを移動するとファイル名の競合が依然として問題になる可能性があります)。 from 複数のディレクトリを単一のディレクトリに移動するとき)。これがあなたが望むものです。あなたが忘れてしまったのは、まずディレクトリを作成することです。

ディレクトリが存在しないため、この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 -vfindそれ以外の場合、その位置は出力されません。

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

役に立つ可能性のあるコメント(以下)のいくつかの情報:

  • mvGNUで使用すると、-t targetディレクトリでなければ失敗します。一度に複数のファイル移動をtarget使用できます(これにより作業速度が向上します)。-exec mv -t /opt/alfresco/archived/2020-01-07 {} +find

  • GNUをmv一緒に使用すると、-n既存のファイルの上書きを拒否します。

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

おすすめ記事