Linuxでmtimeを保持しているフォルダーをmvする方法は?


12

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理解できない理由でリセットされます。

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


なぜあなたの試みはtouchうまくいかなかったのかしら。それはmvステップやtouchサブディレクトリのファイルのmtimeを変更するステップ?NFSサーバーにはどのOSがあり、(知っている場合は)どのファイルシステムタイプですか?
Gilles「SO-邪悪なことをやめなさい」

@ギレス:なぜそれが起こっているのかわかりません。それはmv、トラブルの原因となるステップ。NFSサーバーは実際にはネットアップストレージです。その内部についてはほとんど何も知りません。
Roman Zenka

1
ありがとう。NetAppの奇妙な機能だと思います。それ以外の場合touchはうまくいくはずです。ちなみに、よりポータブルな方法がありますtouch -r "$1" reference.tmp; mv -- "$1" "$2"; touch -r reference.tmp -- "$2"; rm reference.tmp
Gilles「SO-邪悪なことをやめよ」

@ギレス:非常に興味深い、statポータブルではないことに気づかなかった。
Roman Zenka

回答:


15

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

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

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

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

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


mtimeはそれよりも複雑です。親ディレクトリとその直下のディレクトリのみがmtimeを変更しました。他のすべてのディレクトリは同じままです。すべてのディレクトリが変更されるか、または親のみが変更されることを期待します。
Roman Zenka

1
実際には、それは理にかなっています:1)親ディレクトリは、タッチによって明示的に設定されたため、適切なmtimeを持っています。2)親ディレクトリで再作成されたが、それらのmtimeは手動で復元されなかったディレクトリエントリ(Unixディレクトリ構造とiノード形式) 3)同じボリュームにとどまったため、ツリー構造の残りの部分は実際には変更されませんでした。そのためmv、「再帰的」オプションがないので、実際のコピー(たとえば、異なるボリューム)が必要な場合にのみサブディレクトリへの降順が行われます。
ユーレカ2010

@ユーレカ:良い説明ですが、なぜこのように行われるのですか?私が実装した場合はmv、ディレクトリにdata、私は単純に変わってしまう..dataの内容と変更sourceし、target適切に移動された項目を一覧表示するディレクトリを。他のディレクトリを変更する必要はありません。
Roman Zenka

1
@Roman Zenkaいくつかの検索後、この動作はUnicesとファイルシステムの間でかなり緩く指定されているようでrename、カーネルと使用されているファイルシステムによる基礎となるsyscall実装の多くに依存しているようで、NFSが問題に共有を追加しています。矛盾のこの種を参照するいくつかのポインタがありますpatchwork.ozlabs.org/patch/25833の bugs.opensolaris.org/bugdatabase/...
ユーレカ

@エウレカ:私が基本的なことを考えるのがとても混乱していると信じることは非常に難しいと思います。それはほぼ2011年です。それらのリソースをありがとう!
Roman Zenka

4

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

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


これはmacOSでは動作しないようです。
Lenar Hoyt 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.