web-dev-qa-db-ja.com

Linuxでmtimeを保持したままフォルダをmvする方法は?

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をリセットします。

誰かが適切で効率的で正しい解決策を持っていますか?

12
Roman Zenka

POSIX mvには、atime/mtimeの保存を要求するオプションはありませんが、操作は同じボリュームに対してローカルなので、データをコピーする代わりにハードリンクを使用するようにcpに要求できます-lオプションを使用した通常のファイルの例:

cp -p -r -l source/date target/
rm -rf source/data

実際にコピーされるのはディレクトリとファイル参照だけなので、はるかに高速になります。

ハードリンクの詳細については、 対応するウィキペディアのページ を参照してください。

サブディレクトリmtimeが現在のソリューションでリセットされる理由については、親ディレクトリmtimeのみを取得して復元するためです。touchは再帰的なコマンドではありません。

15
Eureka

別の解決策は次のとおりです。

rsync -a --remove-source-files source/data target /

4
Genjo