Bagaimana cara mv folder di Linux mempertahankan mtime-nya?

12

Saya menggunakan CentOS 5.5 dan ingin memindahkan sejumlah besar folder dalam satu volume , mempertahankannya mtime.

Solusi terbaik yang bisa saya temukan adalah seperti ini:

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

Dengan lebih dari 1TB data pada bagian NFS, penyalinan akan berlangsung selamanya. Saya tidak ingin menyalin. Saya ingin bergerak instan.

Ketika saya memindahkan folder menggunakan mv source/data target/, mtimefolder (bukan file) diatur ke waktu saat ini. Ini karena isi folder yang saya pindahkan dimodifikasi oleh operasi ini ( ..entri menunjuk ke inode yang berbeda).

Saya datang dengan skrip shell berikut yang saya sebut 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

Yah, itu tidak berhasil juga. Folder mtimedipulihkan, tetapi semua folder di dalam folder yang saya pindahkan (hanya yang sedalam 1 level) mendapatkan pengaturan mtimeulang karena alasan yang saya tidak mengerti.

Adakah yang punya solusi yang tepat, efisien dan benar?

Roman Zenka
sumber
Saya ingin tahu mengapa upaya Anda dengan touchtidak berhasil. Apakah ini mvlangkah atau touchlangkah yang mengubah waktu subdirektori? OS apa yang ada di server NFS, dan (jika Anda tahu) tipe sistem file apa?
Gilles 'SANGAT berhenti menjadi jahat'
@Gilles: Saya tidak tahu mengapa itu terjadi. Ini adalah mvlangkah yang menyebabkan masalah. Server NFS sebenarnya adalah penyimpanan NetApp, saya hampir tidak tahu apa-apa tentang internalnya.
Roman Zenka
1
Terima kasih. Saya menduga itu adalah keanehan NetApp. Kalau tidak, touchseharusnya bekerja. Omong-omong cara yang lebih portabel akan touch -r "$1" reference.tmp; mv -- "$1" "$2"; touch -r reference.tmp -- "$2"; rm reference.tmp.
Gilles 'SANGAT berhenti menjadi jahat'
@Gilles: Sangat menarik, tidak menyadari statitu tidak portabel.
Roman Zenka

Jawaban:

15

POSIX mvtidak memberikan opsi apa pun untuk meminta pelestarian atime / mtime, tetapi karena operasinya bersifat lokal dengan volume yang sama, Anda dapat meminta cpuntuk menggunakan tautan keras alih-alih menyalin data file biasa menggunakan -lopsi:

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

Karena hanya direktori dan referensi file yang benar-benar akan disalin, itu harus berjalan lebih cepat:

Untuk informasi lebih lanjut tentang tautan keras, Anda dapat melihat halaman Wikipedia yang sesuai

Adapun alasan subdirektori mtime disetel ulang dengan solusi Anda saat ini, itu karena Anda hanya mendapatkan dan memulihkan direktori induk mtime: sentuh bukanlah perintah rekursif.

Eureka
sumber
Mtime lebih rumit dari itu. Hanya direktori induk dan direktori yang langsung di bawahnya yang dapat diubah waktunya. Semua direktori lain tetap sama. Orang akan berharap setiap direktori tunggal akan diubah, atau hanya orang tua.
Roman Zenka
1
Sebenarnya, masuk akal: 1) Direktori induk memiliki mtime yang baik karena secara eksplisit diatur oleh sentuhan, 2) Entri direktori tempat dibuat kembali dengan direktori induk, tetapi mtime mereka tidak dipulihkan secara manual (struktur direktori Unix dan format inode) 3) Sisa struktur pohon tidak benar-benar berubah, karena kami tetap pada volume yang sama: Itu sebabnya mvtidak memiliki opsi "rekursif", turun ke subdirektori hanya dilakukan jika salinan aktual (volume yang berbeda, misalnya) diperlukan.
Eureka
@Eureka: Penjelasan yang bagus, tetapi mengapa dilakukan seperti ini? Jika saya adalah untuk menerapkan mvpada direktori data, saya hanya akan mengubah ..dalam dataisi 's dan memodifikasi sourcedan targetdirektori untuk daftar item dipindahkan dengan benar. Tidak ada direktori lain yang perlu disentuh.
Roman Zenka
1
@Roman Zenka Setelah beberapa pencarian, perilaku ini tampaknya agak longgar ditentukan antara Unices dan filesystems dan bergantung banyak pada renameimplementasi syscall yang mendasarinya oleh kernel dan filesystem yang digunakan, NFS menambahkan andilnya pada masalah. Ada beberapa penunjuk yang merujuk ketidakkonsistenan semacam ini: patchwork.ozlabs.org/patch/25833 bugs.opensolaris.org/bugdatabase/…
Eureka
@Eureka: Saya merasa sangat sulit untuk percaya bahwa sesuatu yang saya anggap sangat mendasar bisa berantakan. Sudah hampir 2011. Terima kasih atas sumber daya itu!
Roman Zenka
4

Solusi lain mungkin:

rsync -a --hapus-sumber-file sumber / target data /

Genjo
sumber
Ini sepertinya tidak berfungsi pada macOS.
Lenar Hoyt