Unix Bashコマンドラインで、基本オペレーティングシステム(PerlやPythonなしなど)を使用して1125日前の日付を計算したい。
GNU Date を実行しているシステムでは、次のようなことができます:
ubuntu $ date --date="1125 days ago" Wed Nov 7 15:12:33 PST 2007
FreeBSDまたはMacOSXシステムはGNUDateに同梱されておらず、「X日前」のような値をサポートしていません。
freebsd81 $ date --date="+1125 days ago" date: illegal option -- -
I MacまたはFreeBSDシステムで数日前の日付を計算できますが、これは数日に制限されています:
# 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
できますかPerlやPythonなどのツールを調べずに、GNU以外のシステムで古い日付を計算しますか?または、より強力なスクリプト言語を使用する必要がありますか?
回答
まあ、次のような卑劣なことをすることができます:
$ echo "`date +%s` - (1125 * 24 * 60 *60)" |bc 1194478815 $ date -r 1194478689 Wed, 07 Nov 2007 18:38:09 -0500
OpenBSD(gnuベースではない日付)でテストされ、動作しているようです。
段階的に分解します:
- 現在のUNIX時間を取得します(UNIXエポックの開始からの秒数):
$ date +%s 1291679934
- 1125の秒数を取得します日
$ echo "1125 * 24 * 60 *60" | bc 97200000
-
一方を他方から差し引く(1291679934-97200000)= 1194478815
-
新しいunixtime(1194478815)を使用して、きれいな日付を印刷します
$ date -r 1194478689 Wed, 07 Nov 2007 18:38:09 -0500
-
代わりに、solarisでこれを実行して日付を印刷できます*:
/bin/echo "0t1194478815>Y\n<Y=Y" |adb
* http://www.sun.com/bigadmin/shellme/
また、dateコマンド**から現在のタイムスタンプを取得するためのSolarisの代替手段は次のとおりです。
/usr/bin/truss /usr/bin/date 2>&1 | nawk -F= "/^time()/ {gsub(/ /,"",$2);print $2}"
** http://www.commandlinefu.com/commands/view/7647/unix-timestamp-solaris
コメント
<から参照ul class = "comments">
%s
とdate -r
はBSDismであることに注意してください(ごく初期の頃から、'すべてのBSDプラットフォームにあります)。 ' System Vプラットフォームでそれらが表示されることを期待しないでください(たとえば、Solarisにはどちらもありません)。回答
前の回答は複雑すぎました。FreeBSD/ macOSにはivがあります MANページからのdate
のid = “5d3ae13b14″>
フラグ(簡略説明):
調整します(つまり、現在の日付を取得して、調整の結果を表示します。実際には日付を設定しません)valに応じて、秒、分、時、月日、曜日、月、または年。 valの前にプラス記号またはマイナス記号が付いている場合、日付は残りの文字列に従って前方または後方に調整されます。それ以外の場合は、日付の関連部分が設定されます。これらのフラグを使用して、日付を必要な回数だけ調整できます。フラグは指定された順序で処理されます。
したがって、目的に応じて、date -v1125d
は必要な処理を実行します。
$ date; date -v-1125d Thu 19 Oct 2017 11:35:25 EDT Sat 20 Sep 2014 11:35:25 EDT
回答
同様の問題が発生していました
dateutils pkg 。それは私にとって単純なpkg_adddateutilsでした。
#!/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
ここに出力されるのは
#2018.11
UPDATE 1
2018.12.10にこのコマンドを実行しています
HostNameHere# dadd date -1125d -f "%Y.%m"
結果
2015.11
時間の加算または減算をサポートしています。印刷に役立つコマンドは次のとおりです。 #dadd -h
(これは印刷物全体ではありません。オプションの詳細があります。
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
ここにコマンドがあります。
ここにフォーマットオプションがあります。
-1mo
。質問のとおり、ユーザーが1125日前の日付を計算できることを示すことができますか?(2)質問にはベースを使用して"と書かれています。オペレーティングシステム(例:PerlまたはPythonなし)。"これにより、新しいパッケージを追加できなくなるようです。