完全なファイルではなく、ファイルのプロパティをバックアップから復元します


2

Linuxコンピューター上の古いストレージから新しい(Linuxベースの)NASにデータをコピーしているときに、新しい場所に沿ってプロパティ(最も重要な変更日)を取得することに失敗しました。また、新しい場所でファイルを使用/変更し続けたため、再度コピーすることはできません。

私がやりたいのは、古いストレージと新しいストレージのファイルの差分であり、それらが同一の場合、LinuxストレージからNASストレージファイルにプロパティを復元します。

これを行うスクリプトやツールなどの巧妙な方法はありますか?Linuxボックスで実行することも、最悪の場合はリモートのWindowsコンピューターから実行することもできます。

提案に感謝します。/ジョン


あなたは可能性があり、同一の場合は、各ファイルのハッシュの両方を比較すると、ファイル(多分SHA1)上で暗号ハッシュを実行しますtouch -m(適切な日付と時刻の設定を持つ)NASファイル。ハックになりますが、うまくいくと思います。
エリオットフリッシュ14

こんにちはエリオット、提案をありがとう。はい、このようなソリューションを作成するには、おそらく数時間かかるでしょう。私は怠け者であり、このために既存のツールを使用できることを望んでいましたが、2番目のオプションとして、あなたのアイデアは良いです。
ジョン14

回答:


0

思いついたコードを共有した方がいいと思った。bashプログラマーではありませんが、Googleを介して利用できる多くの知識があるので、このコードが私のために働くと信じています。基本的にそれがすることは:

  • 新しい場所にあるすべてのファイルとフォルダーを、それぞれについてループします。
    • 同じファイルが古い場所に存在するかどうかを確認します
      • いいえの場合、ログエントリを書き込みます
      • はいの場合、タイムスタンプ(変更日)は一致しますか?
        • はい-ログエントリを書き込む以外に何もしません
        • いいえ、タイムスタンプは一致しません
          • ディレクトリか、ファイルの内容は同じですか?次に、タイムスタンプを古い場所にあるファイルのタイムスタンプにリセットし、ログエントリを書き込みます
          • ファイルの内容が異なる場合は、タイムスタンプも同様です。ログエントリを書き込むだけです。

コード:

shopt -s globstar

NEWDIR="/home/jon"
OLDDIR="/tmp/jon_old"
LOGFILE=restoreDates_$(date "+%Y-%m-%d-%H%M%S").log

echo $LOGFILE > $LOGFILE

for f in "$NEWDIR"/** ; do
OLDFILE=$(sed -e "s/$NEWDIR/$OLDDIR/" <<< $f)

  # Does corresponding file exist in old directory?

  if [ -a "$OLDFILE" ] ; then

    # Do both files have the same modify date?
    if [ $(stat -c %Y "$f") -eq $(stat -c %Y "$OLDFILE") ] ; then
        echo "$OLDFILE already has same modify date/time as $f" >> $LOGFILE
    else

        # Is this a directory?
        if [ -d "$f" ]; then
            echo "$f is a directory, modify timestamp will be reset to that of $OLDFILE; $(stat -c %y "$OLDFILE")" >> $LOGFILE
            touch -r "$OLDFILE" "$f"
        else
            # Not a directory - Is old file equal to the new?
            if $(cmp --silent "$f" "$OLDFILE"); then
                # yes
                echo "$OLDFILE and $f are identic, modify timestamp will be reset to $(stat -c %y "$OLDFILE")" >> $LOGFILE
                touch -r "$OLDFILE" "$f"
            else # File has changed
                echo "$OLDFILE differs from $f , which must have changed" >> $LOGFILE
            fi
        fi
    fi
  else # File does not exist in old directory
    echo "$OLDFILE does not exist (but $f do)" >> $LOGFILE
  fi

done;

コードに関するコメントを歓迎します。


私は、コードボックスにすべてをもたらすことができませんでした... -上記のコードのプレゼンテーションのための私の謝罪
ジョン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.