daftar semua file yang lebih baru dari cap waktu yang diberikan dan urutkan

8

Saya ingin membuat daftar semua file (diurutkan berdasarkan tanggal) yang lebih baru dari timestamp dalam format 20130207003851di direktori / tmp saja. Subdirektori dapat dihilangkan.

Menggunakan SUSE Linux Enterprise Server 11.

Format output seharusnya

S0002948.LOG Feb  7 03:28 
S0002935.LOG Feb  7 05:58 
S0002952.LOG Feb  7 09:58 
S0002940.LOG Feb  7 11:58 

find / tmp -newermt "7 feb 2013" -l mendaftar file yang saya inginkan tetapi

  • bagaimana saya bisa menggunakan cap waktu dalam format 20130207003851
  • bagaimana saya bisa mengurutkan output?
  • bagaimana saya bisa menampilkan hanya nama file dan tanggal. Nama file dulu dan kemudian tanggalnya?

ps saya tidak ingin menggunakan sentuhan untuk membuat file referensi untuk menemukan

ps

find -newermt "20130207003851" -ls
find: I cannot figure out how to interpret `20130207003851' as a date or time
Radek
sumber
Apa yang 2013007000385seharusnya mewakili? Saya kira tahun 2013 adalah tahunnya, tetapi bagaimana Anda bisa mulai dari 007000385tanggal 7 Februari?
Gilles 'SO- stop being evil'
@Gilles: Seharusnya begitu 20130207003851. Tidak menyalinnya dengan benar atau ... maaf untuk itu.
Radek

Jawaban:

10

findmendukung banyak format input tanggal . Format paling sederhana untuk diperoleh adalah YYYYMMDD HH: MM: SS. Anda sudah memiliki digit dalam urutan yang benar, yang harus Anda lakukan adalah mengekstrak grup pertama ( ${timestamp%??????}: ambil semua kecuali 6 karakter terakhir;: ${timestamp#????????}ambil semua kecuali 8 karakter pertama), dan teruskan, tambahkan tanda baca kemudian grup berikutnya saat Anda pergi bersama.

timestamp=20130207003851
timestring=${timestamp%??????}; timestamp=${timestamp#????????}
timestring="$timestring ${timestamp%????}"; timestamp=${timestamp#??}
timestring="$timestring:${timestamp%??}:${timestamp#??}"

Dalam bash (dan ksh dan zsh), tetapi tidak dalam abu, Anda dapat menggunakan ${STRING_VARIABLE:OFFSET:LENGTH}konstruk yang lebih mudah dibaca .

timestring="${timestamp:0:8} ${timestamp:8:2}:${timestamp:10:2}:${timestamp:12:2}"

Untuk mengurutkan file berdasarkan tanggal, cetak nama file yang didahului oleh tanggal dan mengurutkannya, lalu hapus awalan tanggal. Gunakan -printfuntuk mengontrol format output. mencetak sebagian waktu modifikasi yang ditentukan oleh ; jika ini , Anda mendapatkan jumlah detik sejak zaman Unix. Di bawah ini saya mencetak tiga kolom yang dipisahkan tab: waktu dalam format yang dapat diurutkan, nama file, dan waktu dalam format yang dapat dibaca manusia; menghapus kolom pertama dan panggilan untuk mengganti tab dengan ruang yang cukup untuk mengakomodasi semua nama file yang diharapkan (sesuaikan 40 seperti yang diinginkan). Kode ini mengasumsikan Anda tidak memiliki baris baru atau tab dalam nama file.%TXXX@cut -f 2-expand

find -maxdepth 1 -type f \
     -newermt "$timestring" -printf '%T@\t%f\t%Tb %Td %TH:%TM\n' |
sort -k1n |
cut -f 2- |
expand -t 40
Gilles 'SANGAT berhenti menjadi jahat'
sumber
hanya bagian find yang find -newermt "$timestring" -printf '%M@\t%f %Mb %Md %MH:%MM\n'memberi saya hasil lucu-rwxrwxrwx@ S0002975.LOG -rwxrwxrwxb -rwxrwxrwxd -rwxrwxrwxH:-rwxrwxrwxM
Radek
@ Radek Maaf, ini untuk waktunya %T, %Madalah izin.
Gilles 'SO- stop being evil'
Cantik. Bekerja dengan lancar. Kode terakhir saya adalah find /tmp -maxdepth 1 -type f -newermt "20130207 00:38:51" -printf '%T@\t%f-%Tb %Td %TH:%TM\n' | sort -k1n | cut -f 2-saya memisahkan nama file dan waktu -karena saya akan menangkap output dalam php dan menggunakan - sebagai pemisah. Terima kasih banyak.
Radek
@Gilles itu luar biasa, tetapi jika Anda menjelaskan timestring, itu akan membantu lebih banyak ..
Rahul Patil
@RahulPatil Selesai. Saya juga menambahkan metode bash yang lebih mudah dibaca.
Gilles 'SO- stop being evil'
5

Dengan zsh:

zmodload zsh/stat
newer() {
  local t
  zstat -A t -F %Y%m%d%H%M%S +mtime -- $REPLY && (( t >= timestamp ))
}
timestamp=20130207003851
print -rl -- /tmp/*(D.Om+newer)

The newerFungsi kembali benar untuk file yang lebih baru dari $timestamp(catatan bahwa zsh's zstattidak mendukung akurasi subsecond meskipun).

Kemudian yang kita lakukan adalah menggunakan zshkualifikasi globbing: Duntuk memasukkan file dot, .hanya mempertimbangkan file biasa, Omuntuk memesan waktu modifikasi, dan +neweruntuk memanggil newerfungsi untuk menentukan file mana yang akan dipilih.

Jika Anda ingin menampilkan cap waktu file juga, Anda dapat mengubah newerke:

newer() {
  local t
  zstat -A t -F %Y%m%d%H%M%S +mtime -- $REPLY &&
    REPLY+=$'\t'$t &&
    (( t >= timestamp ))
}

Perhatikan bahwa hasil dari pembuatan nama file akan menyertakan cap waktu yang berarti Anda tidak dapat menggunakannya lagi sebagai nama file.

Stéphane Chazelas
sumber
ini tidak akan berhasil ssh, misalnya.
evandrix