Soru Bir dosyanın x zaman önce oluşturulmuş olup olmadığını nasıl kontrol ederim?


Bir dosyanın x zamandan önce oluşturulup oluşturulmadığını linux bash'da kontrol etmek istiyorum.

dosyaya text.txt denir ve zaman 2 saat diyelim.

 if [ what? ]
 then
     echo "old enough"
 fi

76
2018-02-16 09:25


Menşei




Cevaplar:


Sadece değişiklik zamanı için

if test `find "text.txt" -mmin +120`
then
    echo old enough
fi

Veya aynı satırda aynı:

#!/bin/bash
find text.txt -mmin +120 -exec echo "old enough" \;

Kullanabilirsiniz -cmin değişim veya -amin erişim zamanı için. Başkalarının işaret ettiği gibi, yaratma süresini izleyebileceğinizi düşünmüyorum.


103
2018-02-16 09:36



'test' ve backticks'leri bırakabilirsiniz. Bu, 'if (test == true)' veya 'if (test)' ile benzerdir. - guns
@guns: hayır yapamazsın. - kmkaplan
Sen haklısın; Sanırım bunu düşünüyordum. find hiçbir eşleşme bulunmadığında sıfırdan döndürülmüştür. - guns
Backtick'leri bırakabilir ve eğer $ test ederseniz yapabilirsiniz (text.txt -mmin +120) - tommy.carstensen
@BroSlow daha iyi görünüyor: var yok hayır "Birden fazla" mümkün. Tabii ki, text.txt bir dizin olmamalıdır. - kmkaplan


Her zaman kullanmayı sevdim date -r /the/file +%s yaşını bulmak için.

Sen de yapabilirsin touch --date '2015-10-10 9:55' /tmp/file keyfi bir tarihte / saatte son derece ince bir zaman elde etmek için.


33
2018-03-08 00:46



Bugün aynı şeyi arıyordum. En iyi! - Neutralizer
Teşekkürler. Bu SO sorusuna inandım çünkü "dosya basının nasıl yazdırılacağını" yazdım. Yani tam da aradığım şey bu! - Noah Sussman
Teşekkürler! Yukarıdaki tek bir uyarı ile (zaman değil) bir zaman damgası (yaş değil) ama yaşı gibi yaş için kullanılabilir let AGE=$(($(date +%s)-$(date -r /path/to/file +%s)))  [oluşturulan ve hiç değiştirilmemiş, ya da mod ile ilgili yaşa göre varsayım] ile - nhed
function file-age { FILE_CREATED_TIME=`date -r "$1" +%s`; TIME_NOW=`date +%s`; echo "$[ ${TIME_NOW} - ${FILE_CREATED_TIME} ]"; } - turiyag


Oluşturma zamanı saklanmaz.

Depolananlar üç zaman damgasıdır (genellikle belirli dosya sistemlerinde veya belirli dosya sistemi seçeneklerinde kapatılabilirler):

  • Son erişim zamanı
  • Son değişiklik süresi
  • Son değişiklik zamanı

Dosyaya bir "Değiştir", izin değişiklikleri, yeniden adlandırma vb. olarak sayılır. Değişiklik yalnızca içeriktir.


16
2018-02-16 09:33





Kullanmak stat dosyanın son değişiklik tarihini öğrenmek, date güncel zaman ve liberal basitleri anlamaya çalışmak için, dosyanın son değişiklik zamanına göre istediğiniz testi yapabilirsiniz.1.

if [ "$(( $(date +"%s") - $(stat -c "%Y" $somefile) ))" -gt "7200" ]; then
   echo "$somefile is older then 2 hours"
fi

Kod biraz daha az okunabilir iken find Yaklaşım, daha iyi bir yaklaşım olduğunu düşünüyorum. find "bulduğunuz" bir dosyaya bakmak için. Ayrıca, tarih manipülasyonu eğlenceli ;-)


  1. Phil'in doğru bir şekilde belirttiği gibi, oluşturma zamanı kaydedilmez, ancak %Z yerine %Y İstediğiniz ne olabilir "değişim zamanı" almak için aşağıya.

[Güncelleştirme]

Mac kullanıcıları için stat -f "%m" $somefile Yukarıdaki Linux özel sözdizimi yerine


12
2017-09-09 19:18



Hangi kabuk tarih ve stat için yerleşik? Beynim (GNU, 3.2.48) bunlara sahip değil. - Ian Clelland
Ayy üzgünüm. stat yerleşik değil - benden çok kötü, düzelteceğim. - Guss
@ tommy.carstensen - Kullanılabilir bir Mac'im yok. Neyin işe yaramadığını tarif edebilir misiniz? Ayrıca, bash kullanıyor musunuz? Birçok Macist'in zsh'i tercih ettiğini biliyorum. - Guss
@ErikJohansson Ben mevcut bir eser iyi kullanırken ek yazılım yükleme gerektirmez tercih - bu Windows değil, bilirsin ;-) - Guss
Bunu kullanmak ancak değiştirmek isteyen kişiler için, tam olarak ne yaptığını bilmek iyi olurdu: $ (($ (date + "% s") - 1970-01-01 00:00:00 UTC'den beri saniye (Epoch) $ (stat -c "% Y" $ somefile))) - Epoch -gt "7200" den beri geçen sürenin saniye olarak değiştirilme zamanı - farkın x sayısının saniyeden büyük olup olmadığını kontrol eder. - devo


Ctime olmasa da teknik olarak Yaratılış zamanı, çoğu kez.

Ctime, dosyanın içeriğindeki değişikliklerden etkilenmediğinden, genellikle yalnızca dosya oluşturulduğunda güncellenir. Ve evet - Hepinizi çığlıklarını duyabiliyorum - erişim izinlerini veya sahipliğini değiştirirseniz de güncellenir ... ama genellikle bir kez yapılan, genellikle aynı anda dosyayı buraya koyduğunuz bir şeydir.

Şahsen her zaman her şey için mtime kullanırım ve istediğin şeyin bu olduğunu hayal ederim. Ama her neyse ... burada kullanımı kolay bir fonksiyonda Guss'un "çekici" bash bir rehash.

#! / Bin / bash
işlev yaşı () {
   yerel dosya adı = 1 dolar
   yerel değişti = `stat -c% Y" $ dosyaadı "
   yerel şimdi = `date +% s`
   yerel geçen

   bırak artık = şimdi değiştirildi
   echo $ geçen
}

file = "/"
echo $ dosyasının yaşı $ (yaş "$ file") saniyedir.

11
2018-03-25 10:15



Bu yararlı oldu, ancak OSX için hemen işe yaramadı çünkü stat farklı bir şekilde uygulandı. Bulduğum tek çapraz sistem uyumlu yol perl kullanmaktı. İlgili satırı aşağıdakiyle değiştirirseniz, betik Mac'lerde çalışmalıdır: local changed=$(perl -MFile::stat -e "print stat(\"${filename}\")->mtime")  superuser.com/questions/427551/... - Bijou Trouvaille
"Yaratılış zamanı" kavramak zor bir kavramdır. Kopyalanan bir dosya için ne anlama geliyor? Taşınan dosya ne için? Ya bir aygıt sınırında taşınmış olsaydı (yani bir anlamda yeni bir şey yarattı)? Paketlenmiş ve daha sonra paketlenmemiş bir dosya için ne anlama geliyor? Burada birkaç cevap var ve fikir birliği yok. Bununla birlikte camanın bahşedilmesi güzel olsa da, bir "yaratma zamanı" nın belirsiz kavramının yanına semantik olarak koyamazdım. Özellikle basit bir şekilde chmodDosyaya uygulandığında bu fikri geçersiz kılacaktır. Ama ben yaşayabilirim sen bunu yapıyor ;-) - Alfe
@Alfe: Kaybettin +%s ikinci yarısından itibaren - Grizly
Bu yaş daha kısa olabilir: age() { echo $(( $(date +%s) - $(date -r "$1" +%s) )); }  (Düzeltme için @Grizly teşekkürler!) - Alfe
Asla monte edilen tüm dosya sistemlerinde bir oluşturma zamanı olan erişim süresini kullanmak daha iyidir noatime seçeneği (performans için iyidir, bu yüzden kullanmalısınız). Yani sadece kullan %X yerine %Y. - Nux


Bulmak iyi bir şey ama sanırım bir anayol kullanabilirsin, özellikle eğer kaç saniyede dosyaya ihtiyacın varsa

date -d "now - $( stat -c "%Y" $filename ) seconds" +%s

GNU tarihini kullanarak


5
2018-05-06 13:06



Mac üzerinde çalışmıyor. - tommy.carstensen
gstat kullanın, "brew install coreutils" - Erik Johansson
@ erik-johansson Yönetici haklarına sahip değilim. - tommy.carstensen


'Stat' aracının sonucunu düşünün:

  File: `infolog.txt'
  Size: 694         Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d  Inode: 11635578    Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/     fdr)   Gid: ( 1000/     fdr)
Access: 2009-01-01 22:04:15.000000000 -0800
Modify: 2009-01-01 22:05:05.000000000 -0800
Change: 2009-01-01 22:05:05.000000000 -0800

Erişim / değişiklik / değişiklik için üç tarihi burada görebilirsiniz. Yok oluşturulan tarih. Dosya içeriği ne zaman olduğundan emin olabilirsiniz. değiştirildi ("değiştir" alanı) veya onun inode değişti ("değiştir" alan).

Her iki alanın ne zaman güncelleneceği ile ilgili örnekler:

"Değiştir" seçeneği, bir kullanıcı için ek bilgileri birleştirdiyse güncellenir dosyanın sonu.

Birisi chmod yoluyla izinleri değiştirdiyse "Değiştir" güncellenecektir.


3
2018-02-16 09:33



Verilen statü size ilgili bilgileri verebilir. Ama istediğimizi elde etmek için ayrıştırmak oldukça yorucu olacaktır. - PypeBros