CentOS 5.5を使用していて、大量のフォルダを移動したい1ボリューム内、mtime
を保持したい。
私が見つけることができる最良の解決策は次のようなものです:
cp -p -r source/data target/
rm -rf source/data
NFS共有に1TBを超えるデータがあるため、コピーには時間がかかります。コピーしたくない。瞬時に動きたい。
mv source/data target/
を使用してフォルダを移動すると、(ファイルではなく)フォルダのmtime
が現在の時刻に設定されます。これは、移動するフォルダーの内容がこの操作によって変更されるためです(..
エントリが別のiノードを指しています)。
mv_preserve_mtime.sh
と呼ばれる次のシェルスクリプトを思いつきました。
#!/bin/bash
# Moves source folder to target folder.
# You are responsible for making sure the target does not exist, otherwise this blows up
export timestamp=`stat -c %y $1`
mv "$1" "$2"
touch --date="${timestamp}" $2
まあ、それもうまくいきませんでした。フォルダーのmtime
は復元されますが、移動するフォルダー内のすべてのフォルダー(1レベルの深さのフォルダーのみ)は、理解できない理由でmtime
をリセットします。
誰かが適切で効率的で正しい解決策を持っていますか?
POSIX mv
には、atime/mtimeの保存を要求するオプションはありませんが、操作は同じボリュームに対してローカルなので、データをコピーする代わりにハードリンクを使用するようにcp
に要求できます-l
オプションを使用した通常のファイルの例:
cp -p -r -l source/date target/
rm -rf source/data
実際にコピーされるのはディレクトリとファイル参照だけなので、はるかに高速になります。
ハードリンクの詳細については、 対応するウィキペディアのページ を参照してください。
サブディレクトリmtimeが現在のソリューションでリセットされる理由については、親ディレクトリmtimeのみを取得して復元するためです。touchは再帰的なコマンドではありません。
別の解決策は次のとおりです。
rsync -a --remove-source-files source/data target /