Saya memiliki nama file dengan YYYYMMDD
nama file, seperti
file-name-20151002.txt
Saya ingin menentukan apakah ini berkas telah dimodifikasi setelah 2015/10/02.
Catatan:
- Saya dapat melakukan ini dengan melihat output dari
ls
, tetapi saya tahu bahwa mengurai outputls
adalah ide yang buruk. - Saya tidak perlu menemukan semua file bertanggal setelah tanggal tertentu, hanya perlu menguji satu file tertentu pada suatu waktu.
- Saya tidak khawatir tentang file yang dimodifikasi pada tanggal yang sama setelah saya membuatnya. Artinya, saya hanya ingin tahu apakah file dengan
20151002
nama ini diubah pada 03 Oktober 2015 atau lebih baru. - Saya menggunakan MacOs 10.9.5.
bash
files
osx
timestamps
Peter Grill
sumber
sumber
Jawaban:
Berikut beberapa cara yang mungkin dilakukan dengan:
OSX stat
:GNU date
:zsh
hanya:Pemakaian:
Contoh output:
atau
sumber
Script berikut akan memeriksa tanggal semua file yang ditentukan pada baris perintah:
Hal ini membutuhkan GNU versi
sed
,date
danstat
Berikut adalah versi yang belum diuji tetapi harus berfungsi pada Mac (dan pada FreeBSD dll) jika saya telah membaca halaman manual on-line dengan benar:
sumber
sed: illegal option -- r
mengerti dengan MacOS 10.9.5.-r
adalahsed
opsi GNU untuk mengatakannya menggunakan ekspresi reguler yang diperluas. Anda dapat mengubah skrip sed untuk menggunakan regexp dasar daripada diperluas (mis.sed -e 's/^.*\(2015\)/\1/')
Tetapi skrip lainnya mungkin masih akan gagal karena memerlukan versi GNUdate
danstat
, dan saya tidak berpikir Mac datang dengan mereka sebagai standar (meskipun mereka adalah tersedia untuk Mac dalam paket yang telah dikompilasi sebelumnya)Menggunakan bash dan
stat
danexpr
untuk mendapatkan tanggal sebagai angka dan membandingkannya:Ini adalah jawaban spesifik Linux saya sebelumnya.
=~
Operator reg bash menangkap 8 digit nama file ke dalam array bash BASH_REMATCH.[[ ]]
membandingkan string, meskipun Anda hanya membandingkannya sebagai angka[ -gt ]
.sumber
-c
opsi untukstat
.stat -f %m -t %F "$file"
. Maaf, saya tidak bisa mengujinya.stat
sesuai komentar Anda, hal-hal tampaknya berjalan tetapi tidak ada output untuk semua kasus uji. Tapi, apa yang"$file" =~ ([0-9]{8}).txt$
dilakukan?.txt
pada akhir nama file. Tanda kurung()
menangkap bagian 8 digit, dan Anda dapat menemukannya di${BASH_REMATCH[1]}
.if [[=~]]
Anda dapat mencoba dasarif filedate=$(expr "$file" : '.*-\([0-9]*\).txt')
dan kemudian menggantinya${BASH_REMATCH[1]}
dengan$filedate
.Anda bisa melakukan ini:
touch
perintah (menambahkan 0s untuk jam / menit / detik) untuk mengatur tanggal modifikasi untuk file sementaraKarena pertanyaan Anda adalah tentang
bash
, Anda kemungkinan menggunakan Linux. Thetest
program yang digunakan dalam Linux (bagian dari coreutils ) memiliki ekstensi untuk timestamp perbandingan (-nt
dan-ot
) tidak ditemukan dalam POSIXtest
.POSIX berkomentar tentang ini dalam dasar pemikiran untuk
test
:Dengan menggunakan ekstensi itu, Anda bisa melakukannya
-nt
operatortest
untuk membuat perbandingan yang Anda minta.Berikut ini sebuah contoh. Klarifikasi oleh OP menyebutkan platform tersebut, sehingga orang dapat menggunakan
stat
sebagai alternatif untuk file sementara (bandingkan OSX dan Linux ):sumber
trap
perintah.zsh
Pendekatan lain :Akan melaporkan file yang memiliki sesuatu yang terlihat seperti cap waktu di nama mereka tetapi tidak sesuai dengan waktu modifikasi terakhir mereka.
zsh
memiliki sejumlah besar operator seperti itu untuk memanipulasi gumpalan dan variabel. Sangat mudah untuk menyelesaikan pekerjaan apa pun (dan umumnya dapat dipercaya) tetapi cukup sulit untuk menyelesaikannya dan sering kali menghasilkan apa yang biasanya kita sebut kode hanya-tulis (eufemisme untuk kode yang tidak terbaca, meskipun juga menyiratkan bahwa Anda tidak t perlu membacanya saat Anda menulisnya untuk penggunaan tunggal pada command prompt)Jalankan cepat melalui:
**/pattern(qualifier)
: glob rekursif dengan kualifikasi glob.[0-9](#c8)
cocok dengan 8 digit. Itulah zsh extendedglob setara denganksh
's{8}([0-9])
.D
: sertakan file tersembunyie@...@
: kualifikasi global eval untuk menjalankan beberapa teks untuk lebih lanjut memenuhi syarat file. Jalur file dilewatkan$REPLY
zstat...
mengambil mtime yang diformat sebagai YYYYMMDD dalam$m
array.${REPLY:t}
: mengembang ke t tail (nama samaran) dari file.${(SM)something#pattern}
. Ekstrak pola pencocokan bagian dari sesuatu . MerekaS
( pencarian S ubstring) danM
(meluas ke porsi M ) disebut bendera ekspansi parameter .sumber