Linux'ta bir klasörü mv'yi nasıl koruyabilirim?


12

CentOS 5.5 kullanıyorum ve bir birim içinde büyük miktarda klasör taşımak , onların tutmak istiyorum mtime.

Bulabildiğim en iyi çözüm şöyle:

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

NFS paylaşımındaki 1 TB'den fazla veri ile kopyalama işlemi sonsuza kadar sürer. Kopyalamak istemiyorum. Anında hareket etmek istiyorum.

Ben kullanarak bir klasörü taşıdığınızda mv source/data target/, mtimeklasörün (değil dosyaları) güncel saate ayarlanmış olur. Bunun nedeni, taşıdığım klasörün içeriğinin bu işlem tarafından değiştirilmesidir ( ..giriş farklı bir inode işaret ediyor).

Aradığım şu kabuk betiği ile geldim 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

Bu da işe yaramadı. Klasör mtimegeri yüklenir, ancak taşıdığım klasördeki tüm klasörler (yalnızca 1 düzey derinliğinde olanlar) mtimeanlamadığım nedenlerle sıfırlanır.

Herkes uygun, verimli ve doğru bir çözüm var mı?


Merak etme girişiminiz neden touchişe yaramadı. Alt dizinlerin zamanını değiştiren mvadım mı yoksa touchadım mı? NFS sunucusunda hangi işletim sistemi var ve (biliyorsanız) hangi dosya sistemi türünü biliyorsunuz?
Gilles 'SO- kötü olmayı bırak'

@Gilles: Neden olduğunu bilmiyorum. Soruna mvneden olan adımdır. NFS sunucusu aslında bir NetApp depolama alanı, dahili özellikleri hakkında neredeyse hiçbir şey bilmiyorum.
Roman Zenka

1
Teşekkürler. Bunun bir NetApp tuhaflığı olduğundan şüpheleniyorum. Aksi takdirde touchçalışmalıydı. Bu arada daha taşınabilir bir yol olurdu touch -r "$1" reference.tmp; mv -- "$1" "$2"; touch -r reference.tmp -- "$2"; rm reference.tmp.
Gilles 'SO- kötü olmayı bırak'

@Gilles: Çok ilginç, stattaşınabilir olmadığını bilmiyordum .
Roman Zenka

Yanıtlar:


15

POSIX mv, atime / mtime korumasını istemek için herhangi bir seçenek sunmaz, ancak işlem aynı birimde yerel olduğundan cp, -lseçeneği kullanarak normal dosyaların verilerini kopyalamak yerine sabit bağlantılar kullanmayı isteyebilirsiniz :

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

Yalnızca dizinler ve dosya referansları gerçekten kopyalanacağından, çok daha hızlı gitmelidir:

Sabit bağlantılar hakkında daha fazla bilgi için ilgili Wikipedia sayfasına bakabilirsiniz.

Alt dizinlerin mtime neden geçerli çözümünüzle sıfırlandığına gelince, bunun nedeni yalnızca mtime üst dizinini alıp geri yüklemektir: dokunma özyinelemeli bir komut değildir.


Mtime bundan daha karmaşık. Yalnızca üst dizin ve doğrudan altındaki dizinler mtime değişti. Diğer tüm dizinler aynı kalır. Her bir dizinin veya yalnızca üst dizinin değiştirilmesini bekleyebilirsiniz.
Roman Zenka

1
Aslında, mantıklı: 1) Üst dizin iyi dokunma özelliğine sahip olduğu için iyi mtime değerine sahip, 2) Üst dizinle yeniden oluşturulmuş, ancak mtime değerleri elle geri yüklenmemiş dizin girişleri (Unix dizin yapısı ve inode biçimi) 3) Aynı yapıda kaldığımız için ağaç yapısının geri kalanı aslında değişmedi: Bu yüzden mv"özyinelemeli" bir seçenek yok, alt dizinlere inmek sadece gerçek kopyaya (örneğin farklı ciltler) ihtiyaç duyulduğunda yapılır.
Eureka

@Eureka: Güzel açıklama, ama neden bu şekilde yapılıyor? Ben uygulamış olsaydı mvbir dizin data, ben sadece değiştirecek ..içinde databireyin içeriği ve değiştirmek sourceve targetdüzgün taşınan öğeyi listelemek için dizinleri. Başka dizinlere dokunulmasına gerek yoktur.
Roman Zenka

1
@Roman Zenka Biraz arama yaptıktan sonra, bu davranış Unices ve dosya sistemleri arasında oldukça gevşek bir şekilde belirtilmiş gibi görünüyor renameve çekirdek ve kullanılan dosya sistemleri tarafından temeldeki sistem çağrısı uygulamalarının çoğuna bağlı , NFS soruna payını ekliyor. Bu tür tutarsızlıklara işaret eden bazı işaretçiler vardır: patchwork.ozlabs.org/patch/25833 bugs.opensolaris.org/bugdatabase/…
Eureka

@Eureka: Bu kadar basit olduğunu düşündüğüm bir şeyin böyle bir karmaşa olabileceğine inanmakta son derece zorlanıyorum. Neredeyse 2011. Bu kaynaklar için teşekkürler!
Roman Zenka

4

Başka bir çözüm şunlar olabilir:

rsync -a --çıkar-kaynak-dosyalar kaynak / veri hedefi /


Bu macOS üzerinde çalışmıyor gibi görünüyor.
Lenar Hoyt
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.