(Mac / Unix / Linux / script'de) bir dizini tekrarlı olarak bir başkasına kopyalayabilir ve yalnızca değişmemiş dosyaları nasıl değiştirebilirim?


2

Arkaplan ve konu

Geçenlerde Mac OS X'e taşındım ve harici bir sürücüden dosyaları kopyalamak için geçerli olan tarihe (Windows’un yapmadığı) felakete neden olan dosya modifikasyonunu / güncelleme tarihini / zaman damgasını sıfırladığı, Mac’in "özelliğine" çarptım. tarihin önemli olduğu yedekli yedekleme çalışma dosyaları

Bu yüzden, bundan nasıl kaçınacağımı öğrenmeden önce (örneğin, "cp" copy komutunda -p "koru" bayrağını kullanarak) bu arada yeni Mac sabit diskime daha birçok dosyayı ekleyerek mevcut eski dosyaları güncelledik.

Şu anki durum

  • Eski verilerimin ve uygun değişiklik tarihlerinin bulunduğu bir yedek harici sabit diskim var
  • Sıfırlama değişiklik dosyası tarihini içeren bir Mac sabit diskim var (belirli bir veya iki gün)
  • Mac sabit diski, dosyaları değiştirilmiş ve eklenmiş tüm "gerçek" ve "geçerli" dosya içeriğine sahiptir

Neye ihtiyacım var

İhtiyacım var

  • Tüm orijinal dosyaları harici sabit disk sürücüsünden kopyalayın, dosya meta verilerini koruyarak (yalnızca yalnızca değiştirilmiş tarih), ancak SADECE yeni dahili Mac sabit disk IF'yi geçersiz kılar
    • Dosya içeriği (md5 veya her neyse) aynı VEYA
    • Dosya, orijinal felaket başlığının gerçekleştirildiği (tabii ki tüm dosyalarda görebildiğim) günden sonra (dosyanın yeni veya değiştirilmiş olduğunu ima ederek) güncellendi.
  • Kopyanın tüm yeni ve değiştirilmiş dosyaları Mac dahili sabit diskinde tamamen sağlam bıraktığından emin olun.
  • "Hiçbir şekilde kopyasının başlatılması / durdurulması gerekmez (yani ayrıntılı değil), ancak tamamdır"
  • "Özyinelemeli kopya - açıkçası dışa aktarmada bulunan tüm * dosya klasörlerini ve alt klasörlerini kopyalamak istiyorum"

Bu nasıl yapılabilir, herhangi bir fikir?

Yığın Taşması ile ilgili elimden geleni okudum ve hem "rsync" hem de "cp" hakkında man sayfaları ve bilgileri kontrol ettim ama bir yol bulamıyorum ...

Herhangi bir iyi araçlar, senaryolar, püf noktaları, fikirler var mı?


Dosyaları Finder'da harici sürücülerden kopyalamak, değişiklik tarihlerini değiştirmez.
Daniel Beck

Öznitelikleri bozulmadan tutarak her şeyi sürücüden tekrar kopyalayın. DiffMerge veya FileMerge veya potansiyel olarak değiştirilmiş dosyaların ve harici sürücü orijinallerinin diğer klasör hiyerarşi karşılaştırma yardımcı programlarından herhangi birini kullanarak bir klasör karşılaştırması yapın, bunlar değiştirilmiş olanları daha yeni "arşivlenmiş" kopyalamanıza el ile kopyalayın. Bu kadar sayılmazlarsa, en hızlı çözüm budur.
Daniel Beck

Bu araçlara baktım (her ikisine de sahiptiler, geçmişte kod karşılaştırması için DiffMerge kullanıyorlardı), herhangi bir makul şekilde kolay bir şekilde kesebilecek gibi görünmüyorlardı. Ayrıca, aslında binlerce dosya var (docs) , notlar, postalar, kod parçacıkları vb.) bu yüzden biraz kıllı bir görev .. Herhangi birinin başka bir önerisi varsa, memnun oluruz .. Sadece Java API'ye baktım ve aslında bunu kullanarak dosya değiştirme tarihlerini değiştirebilirim. çözüm nedir ama yazmanın ve test etmenin biraz zaman alacağını düşünüyorum .. Başka bir fikriniz var mı?
Daniel Iversen

Geçenlerde find, iki dosya sistemi arasındaki farkları bulmak için linux sistemde oldukça büyük bir ifade kullandım . Ben find(onlar klasörler olmasaydı, bunların boyutları oldukça fazla işe yaramaz) yanı sıra tam dosya yolları ve özelliklerini ekrana execsağlama programlarının (biri md5sumbence). Çıkışı dosyalara aktardım ve ayırdım. Bunu yapabilir, daha sonra bu şekilde belirlenen dosyaları herhangi bir kopyalama komut dosyası için giriş olarak kullanabilirsiniz (dahil etme veya hariç tutma olarak).
Daniel Beck

Sanırım rsyncbunu yapabilir.
Keith

Yanıtlar:


1

Bunu yapmak için bir java programı yazmayı bitirdi ... Kodu buraya yazmaz çünkü hızlı, kirli ve spagetti;) ... Ancak sağlamdır ve basit kaynak kodunu www.nexle.dk/ adresinden indirebilirsiniz. perman-downloads / StackExchange / FileModChanger.java.zip , değiştirmek, özgürce kullanmak ve serbestçe kullanmak için kullanın (ancak hiçbir garanti olmadan, çalıştırmadan önce kontrol edin ve test edin).

Aracın esas olarak yaptığı şey, bir klasör yapısındaki dosyaların son değiştirilme tarihlerini alması ve bu belgeyi THAT tarafından sağlanan başka bir klasördeki dosyalara uygulamasıdır;

  • dosya adları ve yollar aynıdır (güvenlik)
  • dosya içeriği aynıdır (güvenlik için tekrar md5 kontrolü)
  • tarih zaten her iki dosya için aynı değil

~ 500.000 dosyaya karşı koştum ve işe yarıyor gibi görünüyordu

Bazı notlar;

  • yalnızca en son değiştirilen tarih / saat / zaman damgasını değiştirir, bu nedenle güvenli olması gerekir
  • araç "kuru çalıştırma" modunda varsayılan ayardır, yani size ne yapacağını gösterir, ancak değişiklik yapmaz ('real' modu bir komut satırı argümanı 'real tarafından etkinleştirilir)
  • Web'den bazı kodlar kullanır (kaynak dosyadaki kredi).
  • Daha hızlı olabilirdi ama yeterince hızlıydı
  • İlk kez dosyalar için tüm dizinleri ayrıştırırken sevimli küçük bir ilerleme göstergesine sahiptir;)

Kodun tamamında dolaşmak istiyorsanız, bazı kodlardan ilham alabilirsiniz.

Java'da dosya değiştirme tarihi nasıl değiştirilir;

    File sourceFile = new File("/tmp/sourcefile");      
    File targetFile = new File("/tmp/targetfile");

    long sourceDateModified = sourceFile.lastModified();

    targetFile.setLastModified(sourceDateModified);

Umarım başka biri de faydalı bulabilir. Tüm yorumlar ve ipuçları için teşekkürler.


Bitmiş takım için kullanım ve konsol çıktısını indirebilirsiniz (yukarıya bakınız);

$ java -classpath . FileModChanger 

USAGE (dry run, NO file changes made):
  FileModChanger <source folder with  original dates> <target folder with new/erased dates>

USAGE (real run,file date changes WILL be made):
  FileModChanger <source folder with  original dates> <target folder with new/erased dates> real





$ java -classpath . FileModChanger /Volumes/Untitled/D/knowledge/ISYS\ Desktop\ 6/ /Knowledge/ISYS\ Desktop\ 6/
Starting DRY run....
Starting DRY run....
Starting DRY run....
Starting to retrieve list of files (this may take a LONG time)...
0 folders processed 
DONE creating the list of files, starting comparison...



About to operate on Volumes/Untitled/D/knowledge/IS[...]S Desktop 6/ISYSDesktop6Setup.exe:
 SRC:Tue Jul 01 11:29:46 EST 2003 - bff684bfac4ed37e4a6b9a05ab625855 - Volumes/Untitled/D/knowledge/IS[...]S Desktop 6/ISYSDesktop6Setup.exe
 TRG:Tue Dec 21 04:05:24 EST 2010 - bff684bfac4ed37e4a6b9a05ab625855 - /Knowledge/ISYS Desktop 6/ISYSDesktop6Setup.exe


DONE processing all files..










$ java -classpath . FileModChanger /Volumes/Untitled/D/knowledge/ISYS\ Desktop\ 6/ /Knowledge/ISYS\ Desktop\ 6/ real
Starting REAL run....
Starting REAL run....
Starting REAL run....
Starting to retrieve list of files (this may take a LONG time)...
0 folders processed 
DONE creating the list of files, starting comparison...



About to operate on Volumes/Untitled/D/knowledge/IS[...]S Desktop 6/ISYSDesktop6Setup.exe:
 SRC:Tue Jul 01 11:29:46 EST 2003 - bff684bfac4ed37e4a6b9a05ab625855 - Volumes/Untitled/D/knowledge/IS[...]S Desktop 6/ISYSDesktop6Setup.exe
 TRG:Tue Dec 21 04:05:24 EST 2010 - bff684bfac4ed37e4a6b9a05ab625855 - /Knowledge/ISYS Desktop 6/ISYSDesktop6Setup.exe
 RESULT:
   - BEFORE:    Tue Dec 21 04:05:24 EST 2010
   - AFTER:     Tue Jul 01 11:29:46 EST 2003
DONE processing all files..

Ayrıca, çok sayıda dosya ve klasörünüz varsa, Java'nın belleğini arttırmanız gerekebilir.

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.