Unix Bash -komentorivillä haluan laskea päivämäärän 1125 päivää sitten peruskäyttöjärjestelmällä (esim. No Perl tai Python).
Järjestelmissä, joissa on GNU-päivämäärä , voin tehdä jotain tällaista:
ubuntu $ date --date="1125 days ago" Wed Nov 7 15:12:33 PST 2007
FreeBSD- tai MacOSX-järjestelmät eivät toimita GNU-päivämäärän kanssa, eivätkä tue arvoja, kuten ”X päivää sitten”.
freebsd81 $ date --date="+1125 days ago" date: illegal option -- -
I osaa laskea muutaman päivän takaisen päivämäärän Mac- tai FreeBSD-järjestelmässä, mutta tämä on rajoitettu muutamaan päivään:
# Today is really Dec 6, 2010. 4 days ago it was: macosx $ TZ=GMT+96 date +%Y%m%d 20101202 # But that doesn"t work if I want to see the date 8 days ago: macosx $ TZ=GMT+192 date +%Y%m%d 20101206
Voinko laskea vanhat päivämäärät muissa kuin GNU-järjestelmissä käsittelemättä työkaluja kuten Perl tai Python Vai pitäisikö minun käyttää tehokkaampaa komentosarjakieliä?
Vastaa
No, voit tehdä jotain salaa, kuten:
$ echo "`date +%s` - (1125 * 24 * 60 *60)" |bc 1194478815 $ date -r 1194478689 Wed, 07 Nov 2007 18:38:09 -0500
Testattu OpenBSD: llä (ehdottomasti ei gnu-pohjainen päivämäärä) ja näyttää toimivan.
Jaottelu vaiheittain:
- hanki nykyinen unixtime (sekuntia unix-aikakauden alusta):
$ date +%s 1291679934
- saat sekuntien määrän 1125: ssä päivää
$ echo "1125 * 24 * 60 *60" | bc 97200000
-
vähennä toinen toisesta (1291679934 – 97200000) = 1194478815
-
käytä uutta unixtime-ohjelmaa (1194478815) kauniin päivämäärän tulostamiseen
$ date -r 1194478689 Wed, 07 Nov 2007 18:38:09 -0500
-
Vaihtoehtoisesti solaris-sovelluksessa voit tehdä tämän tulostaaksesi päivämäärän *:
/bin/echo "0t1194478815>Y\n<Y=Y" |adb
* viitattu kohteesta http://www.sun.com/bigadmin/shellme/
Solariksessa on myös vaihtoehto saada nykyinen aikaleima päivämääräkomennosta **:
/usr/bin/truss /usr/bin/date 2>&1 | nawk -F= "/^time()/ {gsub(/ /,"",$2);print $2}"
** viitattu osoitteesta http://www.commandlinefu.com/commands/view/7647/unix-timestamp-solaris
Kommentit
uudelleen kaikilla BSD-alustoilla). Älä ’ aio nähdä heidän näkevänsä System V -alustoilla (esim. Solarisilla ei ole kumpaakaan).
Vastaus
Edellinen vastaus oli aivan liian monimutkainen. FreeBSD / macOS: lla on -v
lippu date
, MAN -sivulta (lyhyt kuvaus):
Säädä (eli ota nykyinen päivämäärä ja näytä säätö tulos; ei oikeastaan aseta päivämäärää) toinen, minuutti, tunti, kuukausi päivä, viikonpäivä, kuukausi tai vuosi val-arvon mukaan. Jos val-tunnuksen edessä on plus- tai miinusmerkki, päivämäärää muutetaan eteen- tai taaksepäin jäljellä olevan merkkijonon mukaan, muuten päivämäärän asianmukainen osa asetetaan. Päivämäärää voidaan säätää niin monta kertaa kuin tarvitaan näiden lippujen avulla. Liput käsitellään annetussa järjestyksessä.
Joten date -v1125d
tekee sinun tarkoituksellesi yksinkertaisesti mitä tarvitset
$ date; date -v-1125d Thu 19 Oct 2017 11:35:25 EDT Sat 20 Sep 2014 11:35:25 EDT
vastaus
Minulla oli samanlainen ongelma, löysin dateutils pkg OpenBSD 6.4: lle. Se oli yksinkertainen pkg_add dateutils minulle.
#!/bin/ksh # Using dateutils dadd (get current date) -1month -f (format to strftime) # Set Year in YYYY formant y is YY format lastMonth=$(dadd date -1mo -f "%Y.%m") echo $lastMonth mkdir /home/$usr/History/$lastMonth
Minun täälläni on
#2018.11
UPDATE 1
Suoritan tätä komentoa 2018.12.10
HostNameHere# dadd date -1125d -f "%Y.%m"
Tulos
2015.11
Se tukee kaikkia aikalisäyksiä tai vähennyksiä, jotka voin kertoa. Tässä on komentoja, jotka auttavat tulostamaan. #dadd -h
(tämä ei ole tulosteen kokonaisuus. Asetuksista on lisätietoja.
Usage: dadd [OPTION]... [DATE/TIME] [DURATION] Add DURATION to DATE/TIME and print the result. If DATE/TIME is omitted but DURATION is given, read a list of DATE/TIMEs from stdin. If DURATION is omitted but DATE/TIME is given, read a list of DURATIONs from stdin. Durations are specified as nY, nMO, nW, or nD for years, months, weeks, or days respectively, or nH, nM, nS for hours, minutes, and seconds, where N is a (possibly negative) number. The unit symbols can be written lower-case as well (y, mo, w, d, h, m, s) and the unit symbol `d" can be omitted. Note that duration addition is not commutative! 2000-03-30 +1mo +1d -> 2000-05-01 2000-03-30 +1d +1mo -> 2000-04-30
Tässä ovat komennot.
Tässä ovat muotoiluvaihtoehdot.
Kommentit
- (1) On ’ mukavaa, että tämä ohjelma tukee
-1mo
. Voitteko osoittaa, että sen avulla käyttäjä voi laskea päivämäärän 1125 päivästä sitten, kun kysymys kysytään? (2) Kysymyksessä sanotaan ” pohjan avulla käyttöjärjestelmä (esim. No Perl tai Python). ” Se näyttäisi sulkevan pois uuden paketin lisäämisen. - @ G-Man Kiitos kommentista. Olen uusi osallistunut StackExchangeen. Kiitos avustasi. Katso päivitys 1
%s
jadate -r
ovat BSD-ajatuksia (alusta alkaen, joten id = ”b8164dc8b7”>