Saya ingin membuat daftar semua file (diurutkan berdasarkan tanggal) yang lebih baru dari timestamp dalam format 20130207003851
di 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
shell-script
find
ls
timestamps
Radek
sumber
sumber
2013007000385
seharusnya mewakili? Saya kira tahun 2013 adalah tahunnya, tetapi bagaimana Anda bisa mulai dari007000385
tanggal 7 Februari?20130207003851
. Tidak menyalinnya dengan benar atau ... maaf untuk itu.Jawaban:
find
mendukung 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.Dalam bash (dan ksh dan zsh), tetapi tidak dalam abu, Anda dapat menggunakan
${STRING_VARIABLE:OFFSET:LENGTH}
konstruk yang lebih mudah dibaca .Untuk mengurutkan file berdasarkan tanggal, cetak nama file yang didahului oleh tanggal dan mengurutkannya, lalu hapus awalan tanggal. Gunakan
-printf
untuk 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.%TX
X
X
@
cut -f 2-
expand
sumber
find -newermt "$timestring" -printf '%M@\t%f %Mb %Md %MH:%MM\n'
memberi saya hasil lucu-rwxrwxrwx@ S0002975.LOG -rwxrwxrwxb -rwxrwxrwxd -rwxrwxrwxH:-rwxrwxrwxM
%T
,%M
adalah izin.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.Dengan
zsh
:The
newer
Fungsi kembali benar untuk file yang lebih baru dari$timestamp
(catatan bahwazsh
'szstat
tidak mendukung akurasi subsecond meskipun).Kemudian yang kita lakukan adalah menggunakan
zsh
kualifikasi globbing:D
untuk memasukkan file dot,.
hanya mempertimbangkan file biasa,Om
untuk memesan waktu modifikasi, dan+newer
untuk memanggilnewer
fungsi untuk menentukan file mana yang akan dipilih.Jika Anda ingin menampilkan cap waktu file juga, Anda dapat mengubah
newer
ke:Perhatikan bahwa hasil dari pembuatan nama file akan menyertakan cap waktu yang berarti Anda tidak dapat menggunakannya lagi sebagai nama file.
sumber
ssh
, misalnya.