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/
, mtime
folder (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 mtime
dipulihkan, tetapi semua folder di dalam folder yang saya pindahkan (hanya yang sedalam 1 level) mendapatkan pengaturan mtime
ulang karena alasan yang saya tidak mengerti.
Adakah yang punya solusi yang tepat, efisien dan benar?
touch
tidak berhasil. Apakah inimv
langkah atautouch
langkah yang mengubah waktu subdirektori? OS apa yang ada di server NFS, dan (jika Anda tahu) tipe sistem file apa?mv
langkah yang menyebabkan masalah. Server NFS sebenarnya adalah penyimpanan NetApp, saya hampir tidak tahu apa-apa tentang internalnya.touch
seharusnya bekerja. Omong-omong cara yang lebih portabel akantouch -r "$1" reference.tmp; mv -- "$1" "$2"; touch -r reference.tmp -- "$2"; rm reference.tmp
.stat
itu tidak portabel.Jawaban:
POSIX
mv
tidak memberikan opsi apa pun untuk meminta pelestarian atime / mtime, tetapi karena operasinya bersifat lokal dengan volume yang sama, Anda dapat memintacp
untuk menggunakan tautan keras alih-alih menyalin data file biasa menggunakan-l
opsi: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.
sumber
mv
tidak memiliki opsi "rekursif", turun ke subdirektori hanya dilakukan jika salinan aktual (volume yang berbeda, misalnya) diperlukan.mv
pada direktoridata
, saya hanya akan mengubah..
dalamdata
isi 's dan memodifikasisource
dantarget
direktori untuk daftar item dipindahkan dengan benar. Tidak ada direktori lain yang perlu disentuh.rename
implementasi 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/…Solusi lain mungkin:
sumber