Bagaimana cara memverifikasi bahwa file2 lebih baru dari file1 di bash?


51

Bagaimana saya bisa memverifikasi yang file2terakhir diubah setelah itu file1?

Dalam contoh ini, perldimodifikasi lebih baru daripada stack. Apakah ada perintah bash atau Linux yang dapat membandingkan file-file ini berdasarkan waktu modifikasi?

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

Jawaban:


51

Ditemukan di sini

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

14
Juga -ot"lebih tua dari".
Dennis Williamson

1
Saya pikir saya baru saja mengalami masalah dengan ini. Untuk file dengan waktu modifikasi yang sama hingga detik, mereka adalah usia "sama" dengan tes ini; -nt dan -ot tidak memberikan hasil yang sama (false). Dalam use case saya, saya punya satu program membaca output yang lain, dan saya harus memastikan mereka telah berjalan dalam urutan yang benar. Dalam hal ini tampaknya perlu untuk membandingkan nanodetik.
sjmc

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

Diambil dari ' man test '. Kutipan:

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

7

Cara lain untuk melakukan ini:

find -name file2 -newer file1

akan mengembalikan nol jika file2 lebih tua atau seusia dengan file1. Ini akan mengembalikan nama (dan direktori) file2 jika lebih baru.

Ketahuilah bahwa Linux tidak melacak kapan file dibuat. Tes-tes ini adalah untuk tanggal dan waktu modifikasi terbaru.


2
Linux memang mencatat waktu pembuatan: Namanya ctime. Itu juga melacak waktu akses terakhir: atime. Itu hanya menggunakan mtime umumnya karena ini adalah waktu modifikasi terakhir, yang paling berguna.
Coroos

2
@Coroos: ctimebukan waktu pembuatan. Ini adalah waktu perubahan inode dan diperbarui ketika atribut file seperti pemilik atau izin atau diubah atau ketika Anda memodifikasi file. Beberapa sistem file mendukung waktu kelahiran, tetapi kernel tidak. Stat menunjukkan waktu kelahiran yang kosong. Lihat unix.stackexchange.com/a/91200 Perhatikan bahwa OS X mendukung waktu kelahiranstat -f %SB filename
Dennis Williamson

Lihat juga htrp: //unix.stackexchange.com/a/50184 tentang cara menggunakan debugfsuntuk melihat waktu pembuatan (kelahiran) di Linux.
Dennis Williamson

2

Jika Anda ingin informasi lebih rinci, Anda dapat menggunakan statperintah

<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

Jika hasilnya> 0, file pertama lebih baru. (Lebih baru dalam hal modifikasi terakhir, bukan waktu pembuatan, yang disimpan di linux).


-tidak secara umum lebih baik, tetapi ini masih posting yang bermanfaat ...
BuvinJ

0

Menurut tautan ini, unix tidak menyimpan tanggal pembuatan. http://www.issociate.de/board/post/302628/How_to_check_file_creation_date.html

Tetapi apakah menyimpan akses terakhir.

untuk akses terakhir

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

ls menampilkan setiap file pada baris baru.

jadi ls -t menampilkan file terbaru di baris pertama dll.

  • Anda dapat menggunakan diri Anda untuk memilih baris pertama.
  • Anda dapat menggunakan sed untuk memilih baris pertama.

    ls -t php.exe php.ini | sed -n '1p' php.ini

bisa lakukan -lt meskipun Anda akan melihat bahwa jika Anda tidak menentukan file apa pun .. dan itu direktori .. maka memberikan total pada baris pertama, sehingga Anda memilih baris kedua seperti$ls -lt | sed -n '2p'

Yang baik akan menjadi

ls -t | head -n 1

atau

ls -lt | head   

menampilkan 10 baris pertama agar file pertama diubah terlebih dahulu dan Anda dapat melihat yang mana


-tadalah waktu modifikasi; -uadalah waktu akses
Dennis Williamson

terima kasih .. saya bertanya-tanya tentang -u .. perbedaannya .. dan ya seperti yang Anda sarankan .. -t dan -u dipesan berdasarkan waktu .. seperti yang dilakukan manusia. lebih baik daripada mengatakannya berdasarkan tanggal.
barlop

meskipun mungkin tidak sebagus pepatah yang dipesan berdasarkan tanggal / waktu ;-)
barlop

0

Berikut ini adalah skrip kecil, yang saya lakukan:

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

Anda harus menjelaskan dengan lebih terperinci apa yang dilakukan dengan beberapa referensi untuk perintah ini sehingga orang yang berpotensi menggunakannya memiliki kesempatan untuk membacanya atau mendengar Anda memecahnya sedikit lebih dari sekadar membuktikan perintah dan sintaksis.
Pimp Juice,
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.