19124


Windows PCからテラタームでLinuxサーバに接続し、下記のコマンドを実行します。（シバンではsh指定）

[code]

    date +%Y%m%d%H%M%S -d 20151121181111
    
[/code]

シェル実行後に期待したい出力結果は、`20151121181111`と出ることです。  
しかし出力されるのは `20151121181111000000` となります。  
最終的には、CSVファイルに記載されている日付項目を取り出し、正しい日付形式になっているかどうかを判定するシェルスクリプトを作成したいと思っています。0が出てしまい、正しい比較ができず困っています。（もっとも、別のやり方があるかもしれませんが…）

dateコマンドの仕様等リサーチを行いましたが、どうしてもこの0の出力をコントロールする方法が分かりません。  
お力添え頂けませんでしょうか。


CC BY-SA 3.0
2015-11-21T09:35:30.480
19123
2015-11-22T06:43:41.050
2015-11-22T04:13:36.887
49
13307
question
linux
Linux　コマンド[date +%Y%m%d%H%M%S -d 2015 日付]の出力結果で末６桁に０が追加される…


時刻表記のフォーマットを変えて試してみました。

[code]

    $ date +'%Y-%m-%d %H:%M:%S' -d '20151121181111'
    2015112118-11-11 00:00:00
    
[/code]

つまり、年月日と時分秒の区切りが必要なのですね。そこで、スペースを入れてみました。

[code]

    $ date +'%Y%m%d%H%M%S' -d '20151121 181111'
    date: `20151121 181111' は無効な日付です
    
[/code]

さらに時分秒については `:` で区切る必要がある様です。

[code]

    $ date +'%Y%m%d%H%M%S' -d '20151121 18:11:11'
    20151121181111
    
[/code]

**追記**

RedHat 系 Linux の `/bin/sh` は `/bin/bash` へのシンボリックリンクになっている場合が多いかと思いますので、bash の
substring expansion を使って以下の様にすると良いかもしれません。

[code]

    $ d='20151121181111'
    $ date +'%Y%m%d%H%M%S' -d "${d::8} ${d:8:2}:${d:10:2}:${d:12:2}"
    20151121181111
    
[/code]

bash ではない場合は(例えば Debian 系 Linux では `/bin/dash`)、以下の様になります。

[code]

    $ d='20151121181111'
    $ date +'%Y%m%d%H%M%S' -d "$(expr substr $d 1 8) $(expr substr $d 9 2):$(expr substr $d 11 2):$(expr substr $d 13 2)"
    20151121181111
    
[/code]

また、Linux では distribution に依らずに sed は GNU sed でしょうから、以下の様にもできます。

[code]

    $ date +'%Y%m%d%H%M%S' -d "$(echo $d | sed -r 's/(.{8})(.{2})(.{2})(.{2})/\1 \2:\3:\4/')"
    
[/code]


CC BY-SA 3.0
2015-11-21T10:04:15.937
19124
2015-11-22T06:43:41.050
2015-11-22T06:43:41.050
19123
answer