Dosyaları bir tarihten daha eski olan başka bir dizine taşıyın


28

Bugünden daha eski olan dosyaları taşımak için bir çözüm arıyorum. Günlük bölümüm doluyor, ancak bunları kaldıramıyorum. Uzun zamandır ihtiyaç duyuyorlar. Her neyse, bir çözüm buldum:

find /sourcedirectory -mtime 365 -exec mv "{}" /destination/directory/ \;

Bu işe yarar mı? " -Mtime 365 " nedeniyle sormak , bugün daha eski olan dosyaları yeni bir yere mi taşıyacak?

Teşekkür ederim!

Yanıtlar:


40

Neredeyse haklısın. -mtime 365365 gün eski olan tüm dosyalar olacaktır. 365 gün veya daha eski olanları istersiniz, yani +bu sayıdan önce bir numara eklemek demektir -mtime +365.

Ayrıca -maxdepth 1, alt dizinlerdeki öğeleri taşımanızı engelleyen bayrakla da ilgilenebilirsiniz .

Dizinleri değil yalnızca dosyaları taşıdığınızdan emin olmak istiyorsanız -type f, satıra ekleyin .

Satırın sonuna ekliyoruz \;ki şunu findbiliyoruz ki, çalıştırdığımız komutun sonu budur.

Yani çizgi şöyle olmalı:

find /sourcedirectory -maxdepth 1 -mtime +365 -type f -exec mv "{}" /destination/directory/ \;

Güvenli tarafta olmak için, mv yerine sadece bir ls -l yaparak başlayın - bu şekilde mv ile tekrar çalıştırmadan önce tam olarak istediğiniz dosyaları aldığınızı önceden kontrol edebilirsiniz:

find /sourcedirectory -maxdepth 1 -mtime +365 -type f -exec ls -l {} \;

3
Akılda Ayı mtimeolan Modifikasyon süresi (ki muhtemelen istediğini gibi sesler - Bu çoğu zaman). Bu kayıtlar sık ​​sık okunuyorsa / belirtiliyorsa, kullanmak isteyebilirsiniz -atime(son erişim zamanı).
voretaq7

2
Bu satırın sonundaki ters eğik çizgi ne işe yarıyor?
Ben Liyanage

1
@BenLiyanage Ters eğik çizgi, izleyen noktalı virgül için bir kaçış karakteridir. Noktalı virgül, execifadenin sonu anlamına gelir . İçin man sayfasına bakın find.
Jenny D, Monica

4

Yukarıdaki çözümleri kullanırken dikkatli olun, bunları kullandım ve tüm dosyaları tüm alt klasörlerde taşıdım.

Bu komut tüm dosyaları / kaynak dizininde ve tüm alt klasörleri kaynak dizininde taşır:

find /sourcedirectory -mtime +365 -exec mv "{}" /destination/directory/ \;

Bunun yerine, sadece / sourcedirectory içindeki dosyalar için -maxdepth 1 seçeneğini kullanın.

find /sourcedirectory -maxdepth 1 -mtime +365 -exec mv "{}" /destination/directory/ \;

En yüksek puan alan cevap bu notu içerir ve kullanmanızı önerir -type f. Bunu, alt klasörlerin taşınacağı, ancak içeriğinin taşınmak yerine alt klasörlerde kaldığı anlamına mı geliyorsunuz?
avustinian

1
hayır, demek istediğim 'find', / sourcedirectory içindeki tüm dosyaları ve o zamanlar hakkında düşünmediğim o / sourcedirectory içindeki tüm alt klasörleri bulacaktır. '-Maxdepth 1' 'sadece' bulmayı /
kaynak diziniyle sınırlandırıyor

Btw, bu sadece en yüksek puanlı cevaba bir yorum olarak yapılmış olurdu, ki bu iyi bir cevaptı, ancak itibarım yok. :)
harleygolfguy

0

Bu komutu kullanabilir ve dizinde değil yalnızca dosyalar için bulacağınızı ve dosyanın bir yıldan eski olduğunu belirleyebilirsiniz.

find /sourcedirectory -type f -mtime +365 -exec mv "{}" /destination/directory/ \;

Neden kullanmalı rm? Komutunuz hem günlük dosyalarını hem de hedef dizini siler.
Sven

Ops, hatam, sanırım @mYzk bu dosyaları kaldırmak istiyor. Düzenlendi
cuonglm

0

Dosyalara sık erişilirse aşağıdaki komutu atime ile kullanabilirsiniz.

find /sourcedirectory -type f -atime +365 -exec mv -t /destinationdirectory {} +;

0
$ find /sourcedirectory/ -maxdepth 1 -mtime +365 -exec mv "{}" /destination/directory/ \;

find: missing argument to `-exec'

Doğru gelen eğik çizgi biten kaldırmak olacaktır /sourcedirectory/

$ find /sourcedirectory -maxdepth 1 -mtime +365 -exec mv "{}" /destination/directory/ \;

Testlerimde, find: missing argumenthatayı tekrarlayamadım , ancak sondaki eğik çizgiyi bırakmanın /sourcedirectorydoğru olduğu konusunda hemfikirim .
guzzijason
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.