Saya memiliki direktori yang namanya cap waktu, diberikan dalam milidetik sejak 1970-01-01:
1439715011728
1439793321429
1439879712214
.
.
Dan saya butuh output seperti:
1442039711 Sat Sep 12 08:35:11 CEST 2015
1442134211 Sun Sep 13 10:50:11 CEST 2015
1442212521 Mon Sep 14 08:35:21 CEST 2015
.
.
Saya dapat mendaftar semua direktori dengan perintah:
find ./ -type d | cut -c 3-12
Tapi saya tidak bisa menempatkan output ke perintah berikutnya: date -d @xxxxxx
dan memanipulasi output.
Bagaimana saya bisa melakukan ini?
Fri Oct 2 05:35:28 47592
)Jawaban:
Anda berada di jalur yang benar (untuk solusi yang lebih sederhana, hanya menjalankan 2 atau 3 perintah, lihat di bawah). Anda harus menggunakan
*
alih-alih./
untuk menyingkirkan direktori saat ini somewhat dan ini menyederhanakan pemotongan milidetik, kemudian cukup pipirkan hasilnya ke GNUparallel
atauxargs
²:mendapatkan
dan menambahkan detik offset sebelum itu sebagai contoh Anda menunjukkan:
atau:
mendapatkan:
Namun lebih mudah dilakukan³:
yang memberi Anda hasil yang diminta sekali lagi.
Kerugian menggunakan
*
adalah bahwa Anda dibatasi oleh perintah Anda untuk ekspansi, namun keuntungannya adalah Anda mendapatkan direktori Anda diurutkan berdasarkan nilai timestamp. Jika jumlah direktori bermasalah digunakan-mindepth 1
, tetapi kehilangan urutan:dan masukkan
sort
jika perlu:¹ Ini mengasumsikan tidak ada subdirektori bertingkat, seperti contoh dari contoh Anda. Anda juga dapat menggunakan
./ -mindepth 1
alih-alih*
² Anda dapat menggantinya
parallel
dengan dixargs -I{}
sini seperti yang disarankan @hobbs dan @don_crissti, itu hanya lebih bertele-tele. ³ berdasarkan jawaban Gilles untuk menggunakandate
kemampuan membaca filesumber
xargs
jika Anda tidak punyaparallel
, yang mungkin tidak dimiliki banyak orang.xargs
tidak memiliki pilihan untuk menentukan di mana argumen itu sepertiparallel
memiliki dengan{}
.find ./ -type d | cut -c 3-12 | xargs -I{} date --d @{} +'%Y-%m-%d'
-I
opsi.--d
atau--da
akan bekerja dengan versi GNU saat inidate
, tetapi itu bisa berhenti bekerja haridate
memperkenalkan--dalek
opsi (untuk tanggal dalam kalender Dalek).Saya akan menghindari menjalankan beberapa perintah per file dalam satu lingkaran. Karena Anda sudah menggunakan GNUisms:
Yang hanya menjalankan dua perintah.
strftime()
khusus untuk GNUdate -d
.sumber
Anda sudah memiliki:
yang mungkin memberi Anda cap waktu dalam format zaman. Sekarang tambahkan loop sementara:
Perhatikan bahwa dalam beberapa shell, sintaks itu mendapatkan loop sementara dalam subkulit, yang berarti bahwa jika Anda mencoba mengatur variabel di sana, itu tidak akan terlihat setelah Anda meninggalkan loop. Untuk memperbaikinya, Anda perlu sedikit memutar kepala:
yang menempatkan
find
di subkulit, dan membuat loop sementara di shell utama. Sintaks itu (AT&Tksh
,zsh
danbash
spesifik) hanya diperlukan jika Anda ingin menggunakan kembali hasil dari dalam loop.sumber
done <(find)
alih-alihdone < <(find)
, itu benar untukyash
(di mana<(...)
proses redirection, bukan proses substitusi), jadi edit saya agak angkuh karena itu mungkin shell yang Anda maksudkan untuk itu.Jika Anda memiliki tanggal GNU, itu dapat mengonversi tanggal dibaca dari file input. Anda hanya perlu memijat cap waktu sedikit sehingga dapat mengenali mereka. Sintaks input untuk stempel waktu berdasarkan zaman Unix
@
diikuti oleh jumlah detik, yang dapat berisi titik desimal.sumber
date
pembacaan file. Ini akan memberikandate: invalid date ‘@’
karena terjemahan direktori saat ini (./
). Dan karena Anda dapat membuang milidetik, Anda dapat menyederhanakansed
pengeditan kedua untuk hanya menjatuhkan 3 karakter terakhir. Atau hapus semua itu dan gunakanfind * -type d -printf "@%.10f" | date ...
Saya akan melakukannya perlishly - memberi makan dalam daftar cap waktu:
Output ini:
Jika Anda menginginkan format output tertentu, Anda dapat menggunakan
strftime
mis:Yang mengubah ini menjadi satu liner di pipa Anda:
Tapi saya mungkin menyarankan bukannya melihat menggunakan
File::Find
modul dan melakukan semuanya dalam perl sebagai gantinya. Jika Anda memberikan contoh struktur direktori Anda sebelum memotongnya, saya akan memberikan Anda sebuah contoh. Tapi itu akan menjadi sesuatu seperti:sumber
Dengan
zsh
dan strftime builtin:ini mengasumsikan semua nama direktori Anda di direktori saat ini sebenarnya zaman zaman.
Pemfilteran / pemrosesan lebih lanjut dimungkinkan asalkan Anda mengklarifikasi bagaimana angka-angka dalam contoh Anda harus diproses (angka-angka itu lebih mirip dengan zaman zaman yang berkaitan dengan tanggal kelahiran Puteri Leia dan Luke Skywalker ...) mis. Pencarian secara rekursif untuk nama-nama direktori yang cocok dengan setidaknya 10 digit dan hitung tanggal berdasarkan 10 digit pertama:
sumber
Menggunakan GNU Parallel:
Jika Anda dapat menerima alih-alih ruang:
sumber
parallel
tertulis dalamperl
. Ini tampaknya berlebihan mengingatperl
memilikistrftime()
operator. Sepertiperl -MPOSIX -lpe '$_.=strftime(" %c", localtime substr $_, 2, 10)'
parallel
. IMO,parallel
adalah alat yang hebat untuk memparalelkan tugas-tugas intensif CPU, tetapi tidak benar-benar sesuai untuk tugas semacam ini di sini.Biasanya perintah find dapat dirantai dengan perintah apa pun menggunakan
exec
argumen.Dalam kasus Anda, Anda dapat melakukannya seperti ini:
sumber
Menggunakan Python (itu solusi yang paling lambat)
memberi:
sumber