思いついたコードを共有した方がいいと思った。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;
コードに関するコメントを歓迎します。
touch -m
(適切な日付と時刻の設定を持つ)NASファイル。ハックになりますが、うまくいくと思います。