File2'nin bash'deki file1'den daha yeni olduğunu nasıl doğrulayabilirim?


51

Bunun file2en son değiştirildiğini nasıl doğrulayabilirim file1?

Bu örnekte, perldaha yakın zamanda değiştirildi stack. Değişiklik zamanına göre bu dosyaları karşılaştırabilecek bir bash veya Linux komutu var mı?

-rw-r--r--    1 root     root         1577 Sep  7 22:55 stack
-rwxr-xr-x    1 root     root          626 Sep  7 23:10 perl

Yanıtlar:


51

Buldum burada

for f in /abcd/xyz* do
   [ "$f" -nt /abcd/test.txt ] && echo "file f$ found" done

14
Ayrıca -ot"daha eski" dir.
Dennis Williamson,

1
Sanırım bununla ilgili bir sorunla karşılaştım. Aynı değişiklik zamanını saniyelere kadar düşüren dosyalar için, bu testlerin "aynı" yaşı vardır; hem -nt hem de -ot aynı sonucu verir (yanlış). Kullanım durumumda diğerlerinin çıktılarını okuyan bir program var ve doğru sırayla çalıştıklarından emin olmam gerekiyor. Bu durumda, nanosaniye karşılaştırmak gerekli görünüyor.
sjmc

38
if [[ FILE1 -nt FILE2 ]]; then
  echo FILE1 is newer than FILE2
fi

' Adam testi ' den alınmıştır. Alıntı:

FILE1 -nt FILE2
  FILE1 is newer (modification date) than FILE2

7

Bunu yapmanın başka bir yolu:

find -name file2 -newer file1

file2 daha eski veya file1 ile aynı yaştaysa null değerini döndürür. Daha yeniyse, file2 dosyasının adını (ve dizinini) döndürür.

Linux'un dosyaların ne zaman oluşturulduğunu takip etmediğini unutmayın. Bu testler en son değişiklik tarihi ve saati için yapılacaktır.


2
Linux yaratılış zamanını izler: Buna ctime denir. Ayrıca, son erişim zamanının kaydını tutar: atime. Genellikle mtime kullanır, çünkü bu en faydalı olan son değişiklik zamanıdır.
Coroos

2
@Coroos: ctimeYaratılış zamanı değil. Bu inode değişim zamanıdır ve dosyanın sahibi veya izinleri gibi öznitelikleri değiştiğinde veya dosyayı değiştirdiğinizde güncellenir. Bazı dosya sistemleri doğum zamanını desteklemektedir, ancak çekirdek desteklememektedir. Stat boş bir doğum zamanı gösterir. Bkz. Unix.stackexchange.com/a/91200 OS X'in doğum süresini desteklediğine dikkat edinstat -f %SB filename
Dennis Williamson

Ayrıca Linux'ta debugfsyaratma (doğum) zamanını görmek için nasıl kullanılacağına ilişkin htrp: //unix.stackexchange.com/a/50184 adresine bakın.
Dennis Williamson

2

Daha ayrıntılı bilgi istiyorsanız, bu statkomutu kullanabilirsiniz.

<tbielawa>@(fridge)[~/SuperUser] 03:15:10
$ touch firstFile
<tbielawa>@(fridge)[~/SuperUser] 03:15:24
$ touch secondFile
<tbielawa>@(fridge)[~/SuperUser] 03:15:45
$ stat firstFile 
  File: `firstFile'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d  Inode: 151528      Links: 1
Access: (0644/-rw-r--r--)  Uid: (  500/tbielawa)   Gid: (  500/tbielawa)
Access: 2010-09-14 03:15:24.938721003 -0400
Modify: 2010-09-14 03:15:24.938721003 -0400
Change: 2010-09-14 03:15:24.938721003 -0400
<tbielawa>@(fridge)[~/SuperUser] 03:15:48
$ stat secondFile 
  File: `secondFile'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d  Inode: 151529      Links: 1
Access: (0644/-rw-r--r--)  Uid: (  500/tbielawa)   Gid: (  500/tbielawa)
Access: 2010-09-14 03:15:45.074722792 -0400
Modify: 2010-09-14 03:15:45.074722792 -0400
Change: 2010-09-14 03:15:45.074722792 -0400

2
echo $(($(date -r file1 +%s)-$(date -r file2 +%s)))
2208

Sonuç> 0 ise, ilk dosya daha yenidir. (Son değişiklik açısından daha yeni - linux'da depolanan oluşturma zamanı değil).


-nt genellikle daha iyi, ama bu hala yararlı bir yazı ...
BuvinJ

0

Bu bağlantıya göre, unix oluşturma tarihini saklamaz. http://www.issociate.de/board/post/302628/How_to_check_file_creation_date.html

Ancak son erişimi depolar.

son erişim için

 ls -t  # displays in order of date. So the first one is the 

ls her dosyayı yeni bir satırda görüntüler.

Böylece ls -t ilk satırdaki en son dosyayı gösterir.

  • İlk satırı seçmek için kendinizi kullanabilirsiniz.
  • İlk satırı seçmek için sed'i kullanabilirsiniz.

    ls -t php.exe php.ini | sed -n '1p' Instagram Hesabındaki Resim ve Videoları php.ini

yapabileceğini -lt Eğer herhangi bir dosya belirtmek yoksa o görürler .. ve dizin .. o zaman ilk satırda toplam verir vermez sen gibi ikinci hattı almak böylece$ls -lt | sed -n '2p'

İyi bir olurdu

ls -t | head -n 1

veya

ls -lt | head   

ilk 10 satırı ilk önce değiştirilmiş ilk dosyayı görüntüler ve hangisinin olduğunu görebilirsiniz


-tdeğişiklik zamanı; -uerişim zamanı
Dennis Williamson

teşekkürler .. merak ediyordum -u .. ayrım .. ve önerdiğin gibi evet. tarihe göre sipariş vermekten daha iyi.
barlop

gerçi belki de ;-) tarih / saate göre sıralı derken olarak iyi olarak
barlop

0

İşte küçük bir senaryo, yaptım:

mtf0=`stat -c %Y file0`    
mtf1=`stat -c %Y file1`    
dt=$(( mtf1 - mtf0 ))    
[[ $dt -gt 0 ]] && echo "File F1 is newer than file F0 "

Bunun komutla ilgili bazı referanslarla ne yaptığını daha ayrıntılı bir şekilde açıklamanız gerekir, böylece potansiyel olarak kullanan kişilerin bu komutları ve sözdizimini kanıtlamaktan daha fazlasını okuma ya da ayrılma duyma fırsatını biraz daha fazla duyma olanağına sahip olmalarını sağlar.
Pezevenk Suyu BT,
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.