Bir günden daha yeni dosyaları bulma ve kopyalama


12

SADECE son gün içinde oluşturulmuş dosyaları başka bir klasöre kopyalayacak bir komut dosyası üzerinde çalışıyorum. Sahip olduğum sorun sadece bir günden daha eski dosyalar yerine kaynak dizindeki tüm dosyaları kopyalar.

Sahip olduğum şey bu:

find . -mtime -1 -exec cp --preserve --parents -a "{}" /somefolder \;

Yukarıdaki kod, kaynak dizindeki tüm dosyaları kopyalar. 'Cp' için tüm bağımsız değişkenleri kaldırırsam çalışır:

find . -mtime -1 -exec cp "{}" /somefolder \;

Yukarıdaki kod istediğim gibi sadece en yeni dosyaları kopyalar ama cp argümanlarını kullanarak öznitelikleri korumak gerekir.

Ayrıca değişkenleri denedim ve belki -exec seçeneği sorun olduğunu düşünme döngüler için:

files="$(find -mtime -1)"
for file in "$files"
do
cp --parents --preserve -a file /somefolder

Ancak, yukarıdaki döngü sonuçları aynı sorunla sonuçlanır, tüm dosyalar kopyalanır. $ Dosyalarını yankılarsam yalnızca ihtiyacım olan dosyalar gösterilir.

Bunu nasıl çalıştırabilirim?


1
Tamam ben bunu kullanarak çalışıyorum düşünüyorum:find /sourcefolder -type f -mtime -1 -exec cp -a "{}" /somefolder \;
mac1234

Rsync bu görev için cp yerine daha iyi bir araç olmaz mı? rsync -a kaynak hedef
Darryl

Yanıtlar:


9

Bazı uygulamaların cpbir -tseçeneği vardır, böylece hedef dizini dosyalardan önce koyabilirsiniz :

find . -mtime -1 -exec cp -a --parents -t /somefolder "{}" \+

Bu ikincisini kaldırdığımı -aima ettiğine dikkat --preserveedin.


Bu aynı zamanda eski dosyaları olan klasörleri kopyalar ...?
Luis A. Florit

3

Bunun için kullanabilirsiniz pax:

pax -wrT "11$(date +%H%M)," . /destination/folder

Komut satırı adım adım:

  • -wr- paxhem -wayin hem de -read seçenekleri verildiğinde kopyalar. Muhtemelen burada da yararlı. (ancak yukarıdaki komuta dahil değildir)

    • -lmürekkep - dosya verilerini kopyalamak yerine mümkünse sabit bağlantılar oluşturur.

    • -Xpaxaynı kaynak cihaz ve / veya dosya sistemine kısıtlama için.

    • -s/src regex/replace/ - akıştaki dosya adlarını değiştiren

    • -verbose - kaynaklı / hedeflenmiş dosyalar hakkında rapor oluşturmak için.

  • -T- -THedef arşiv için ime seçeneğin seçer dosyaları (birlikte kullanıldığında veya sadece kopyalamak için -wr) onların dayalı /modification veya inode /change (veya her ikisi) kere. Varsayılan olarak mod zamanıdır. Gönderen ...

adam pax

  • ... Pax zamana dayalı artımlı arşiv oluşturmak için her iki dosya saatini kullanan zaman karşılaştırmaları yararlıdır (yalnızca belirli bir zaman aralığında değiştirilen dosyalar arşivlenir).

  • Bir zaman aralığı altı farklı alandan oluşur ve her alan iki basamak içermelidir. Biçim:

    [[[[[cc]yy]mm]dd]HH]MM[.SS]

  • Nerede ccyıl (yy) 'nin ilk iki basamağıdır yyilk, yılın son iki rakamıdır mmay (01 ile 12 arasında) olduğu dd(01 ile 31) ayın günüdür, HHolduğu günün saati (00'dan 23'e kadar), MMdakikadır (00'dan 59'a kadar) ve SSsaniyedir (00'dan 59'a kadar). Dakika alanı MMzorunludur, diğer alanlar isteğe bağlıdır ve aşağıdaki sırayla eklenmesi gerekir:

    HH, dd, mm, yy, cc

  • SSAlan bağımsız bir şekilde, diğer alanların ilave edilebilir. Zaman aralıkları geçerli saate göre, bu nedenle ...

    -T 1234/cm

  • ... değişiklik veya inode değiştirme zamanı 12: 34 PM olan tüm dosyaları bugün veya daha sonra seçer

  • Birden fazla -Tzaman aralığı sağlanabilir ve kontrol ilk eşleme ile durur.

... yani 11benim örnek komutumun yukarısında bugün göreceli - bugünün tarihinden daha az - on ikincisi - ve gerisi sadece standart bir "$(date)"format ve ardından virgül geliyor.

... hariç - ve bahsetmeye değer son şey - Hedef dizin için mutlak bir yol kullanıyorum - ve eğer bunu yaparsanız yapmalısınız. Dokümanlar , göreceli hedef yollar için belirtilmemiş davranışa atıfta bulunuyor - ve ilk kez kullanmayı denediğimde pax, mutlak bir yol kullanana kadar garip sonuçlarla karışan bir saat boyunca nefesim altında yemin ettim.


2

Herkese yardım için teşekkürler, önerilerinizin bir kombinasyonunu kullanarak çalışmasını sağlayın:

Aşağıdaki kod ile gitti ve mükemmel çalışıyor.

find /sourcefolder -type f -mtime -1 -exec cp -a "{}" /somefolder \;

Tekrar teşekkürler!


2

Ben tamamen aynı işlevselliği yapıyordum ama klasör yapısını korumak için gerekli. Bu yüzden yaptığım şey biraz farklı.

cd sourcedir
find . -type f -mtime -$days -print0 | tar -czvf ${tarpath}/testtar.tar.gz --null -T -

$ $ gün sayısı $ tarpath bu dosyaları depolamak için geçici yoldur. ve geri yüklemek istediğimde.

cd $destdir
tar -xvzf ${tarpath}/testtar.tar.gz

Bu benim için hile yaptı.

Not: yedek alırken bazı klasörleri hariç tutmak istiyorsanız aşağıdaki komutu kullanabilirsiniz

find . -type f -mtime -$days ! -path '*/FolderToavoidSearch/*' -print0 | tar -czvf ${tarpath}/testtar.tar.gz --null -T -

Avantajı: 1. Her zaman son kez sıkıştırılmış biçimde geri yüklediğim şeyin bir kopyasını aldım.

  1. Ayrıca ben gidip bu dosyaların ne olduğunu kontrol edebilirsiniz geri yükleme arasında bir duraklama var ve hepsi tamam sonra komut dosyası ile devam edin.

  2. Klasör yapısını korur, böylece değiştirilmiş dosyaların kaynak dizinden hedef dizine üzerine yazılmasını sağlar

Not: Öte yandan gereksinim gün sınırlı değilse rsync kullanırdım

rsync -avz --exclude 'FolderToavoidSearch' --backup --backup-dir="/backup/dir/test/backup_$(date +\%Y-\%m-\%d)" /source/dir/ /dest/dir/

burada tarihli rsyc için daha fazlası


1

Belirli bir güne geri dönmekten başka kesin tarih ve saat de seçilebilir

(Bu yalnızca dosya adlarınızda boşluk, sekme veya joker karakter olmaması durumunda iyi çalışır)

cp `find . -type f -newermt '17 dec 2016 20:10:00'` FOLDER

Yukarıda, 17 Aralık 2016 20:10:00 tarihinden sonra oluşturulan dizindeki tüm dosyaları KLASÖR'e (bugün 1 gün önce :) kopyalar.

Find komutunun simgesine dikkat edin, bu değil: 'bu, bir backtick: `tarih seçimi şununla:'

Adlarında boşluklar, sekmeler, yeni satırlar veya joker karakterler bulunan dosyalar için, Stéphane Chazelas'ın çözümlerinden birini kullanabilirsiniz, önce GNU için, ikincisi GNU veya bazı BSD'ler için:

find . -type f -newermt '17 dec 2016 20:10:00' -exec cp -t FOLDER {} + 
find . -type f -newermt '17 dec 2016 20:10:00' -exec sh -c 'cp "$@" FOLDER' sh {} +


Teşekkürler Stephane, bu yüzden bunu herhangi bir gönderide bulamamış olabilirim, ancak benim durumum için bir cazibe gibi çalıştı. bunu yaptığınızda sadece bulmak. tipi f -newermt '17 Aralık 2016 20:10:00 '
FatihSarigol

... o zamandan sonra oluşturulan dosyaları basar, ne tür bir soruna neden olabileceğinden emin değilim. sonra sadece kopyalanacak bu dosyaları seçmek için backticks kullanın. şerefe
FatihSarigol

Paylaştığınız gönderinin "Döngü üzerinden" olduğuna inanıyorum, kodumun sonucu üzerinde döngü mü? ya da sadece find'ın kopya tarafından kullanılacak sonucunu mu seçiyor? (3 yorum için özür dilerim, henüz
yorumumu

1
find . -type f -newermt '17 dec 2016 20:10:00' -exec cp -t FOLDER {} +(GNU) veya find . -type f -newermt '17 dec 2016 20:10:00' -exec sh -c 'cp "$@" FOLDER' sh {} +(GNU veya bazı BSD'ler kullanın ( taşınabilirliği sınırlayıcı faktör -newermtburada yüklemdir)).
Stéphane Chazelas
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.