それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

date コマンドで相対日付で目的の日をパパっと計算する。(毎月の最初の月曜日など)

date コマンドをさらに、見なおしてみた。意外と使えるんじゃないかと思うんですね。

dateコマンドを活用するのに最初に覚えること

  1. ”+ 1day”
  2. %F オプション

これを覚えとくだけで、そこそこ使い勝手がいい。

実例

ある日から90日後を探す
takuya@atom:~$ date --date "2012/11/22 + 90days" +"%F"
2013-02-20

ね?便利でしょ

--date で日付を指定

+"%F" で %Y-%m-%d の省略形

takuya@atom:~$ date --date "2011/11/22" +"%F"
2011-11-22

最初に、以上を覚えておけば、直ぐ使えます。

それでは、使い込んでみましょう

相対的日時を求める

ある日から、一ヶ月後
takuya@atom:~$ date --date "2012/11/22 + 1month" +"%F"
2012-12-22

ある日から、1日前

takuya@atom:~$ date --date "2012/3/1 - 1days" +"%F"
2012-02-29

オプションをもうちょっと。

もうちょっと細かく使い込む。

オプションの重ね書きが可能

takuya@air:~/Desktop$ date --date "today next monday next month" +"%F"
2012-12-26

去年のクリスマスは何曜日?

takuya@air:~/Desktop$ date --date "2012/12/25" +"%F(%a)"
2012-12-25(火)

特定の日を調べたければ、calコマンド使えって話ですけどね。

毎月の最初の月曜日を求める。

毎月の最初の月曜日を求める。

date --date "this month next monday " +"%F"
2021-03-08

毎月の最後の月曜日を求める。

月の最後の月曜日を求めるには、いったん翌月1日を得たあとに、そこから直近月曜日をさかのぼり求めておけばできる。

$ date --date "next month last monday " +"%F"
2021-03-22

コマンドを更に組合わせる

date コマンドが相対日付を扱えるので、日付をまとめて作るのがとても簡単

takuya@air:~/Desktop$ for i in {0..30}; do date --date "2012-11-01 +$i days" +"%F"  ; done
2012-11-01
2012-11-02
2012-11-03
2012-11-04
2012-11-05
2012-11-06
2012-11-07
2012-11-08
2012-11-09
2012-11-10
2012-11-11
(中略
2012-11-27
2012-11-28
2012-11-29
2012-11-30
2012-12-01

直近30日の日付をパパっと作れるのですね。これは便利ですね。

さらに、バッククオートと組合わせる。

日付でディレクトリやファイルを作ることが出来るよね。

takuya@air:~/Desktop/date$ for i in {0..30}; do mkdir `date --date "2012-11-01 +$i days" +"%F"`  ; done
takuya@air:~/Desktop/date$ ls 
2012-11-01  2012-11-05	2012-11-09  2012-11-13	2012-11-17  2012-11-21	2012-11-25  2012-11-29
2012-11-02  2012-11-06	2012-11-10  2012-11-14	2012-11-18  2012-11-22	2012-11-26  2012-11-30
2012-11-03  2012-11-07	2012-11-11  2012-11-15	2012-11-19  2012-11-23	2012-11-27  2012-12-01
2012-11-04  2012-11-08	2012-11-12  2012-11-16	2012-11-20  2012-11-24	2012-11-28

おお、コマンド使える。

昨日のバックアップを定期的に取るなら

rsync -avz --no-P /var/www /var/backup/`date --date="yesterday"`

これをcronに書けばいいですね。

ちなみに、date コマンドが使ってる日付フォーマットは

man strftime

で見ることができます。

-d は --date オプションでも可能

takuya@air:~/Desktop$ date -d "2012/12/25" +"%F(%a)"
2012-12-25(火)

GNU date の書式

これらは、GNU Coreutilsの date コマンドの書式になるので、gnu date を内部的に呼び出しているようなプログラム言語や、互換性があるものは概ね紹介した ` next month ` ` 3 days ago ` などが使える。
https://www.gnu.org/software/coreutils/manual/html_node/Examples-of-date.html

2021-03-01 更新

毎月の最初の月曜日・最後の月曜日求める方法を記載。gnu date について言及

info コマンド:Emacs で man を読む

マニュアルを読むなら、man コマンドだと思ってました。すいません。Emacs移行中のvi ユーザなんで。。。

info コマンドを知りました。man ページ

マニュアルといえばman

man strftime 

これ、vi モードなんですよね。*1

info コマンドなら Emacs でman を読める

info strftime


コッチはEmacsモード。Emacsな人だと常識かもしれませんが・・・知らなかったです。

一応終了方法を書いておくと C-x C-c です。(C - x は ctrl x 同時押し)




*1:もちろんC-v でページ送りできる。けどね C-x C-cは使えないんだよ

Curlコマンドの使い方例。curlコマンドの情報は意外と少ない・・・

curl 便利ですよね。毎日のように使います。プログラミングなしでWEBアクセスやSCPアクセスができるので重宝します。

curl の使い方

curl コマンドでよく使うものについてまとめておきます。

ページ取得 curl URL

まず一番単純な例。example.comサイトのトップページを標準出力へ出力。

curl http://www.example.com/

ページをファイルに保存 curl -o name URL

標準出力ではなくローカルへ自由なファイル名で保存するには-oオプションで。

$ curl -o my.jpg  http://www.example.com/top.jpg
-O(オーの大文字)オプションの場合

-O (大文字)はURL上のファイル名で保存する。

$ curl -O http://www.example.com/images/photo1.jpg

この場合 http://www.example.com/ のように、ファイル名が無いURLに使うと、ファイルが作成されないことに注意。


POST送信 -d オプション。

フォームの送信と同様な事をCurlでする。POSTの送信。この場合は application/x-www-form-urlencodedに相当する。

curl -d name=takuya -d hatena_id=takuya_1st  http://example.com/oauth.php

-d KEY=VALUE を重ねて書けばいい 。

POSTデータは、POST本文にGET引数と同じものを key=value&key1=value2&key2=value2 と続けて書く感じですね。詳しくはapplication/x-www-form-urlencodedについて知っておきましょう。

サーバーのHTTPヘッダー情報取得 curl -I URL

私はこれを一番良く使います。ヘッダー情報を閲覧することでサーバーになるのがいい。

takuya@air:~/Desktop$ curl -I  mixi.jp
HTTP/1.1 200 OK
Date: Wed, 21 Nov 2012 05:55:22 GMT
Server: Apache
X-Dealer: 151060
Cache-Control: no-cache
Pragma: no-cache
X-XRDS-Location: https://mixi.jp/xrds.pl
X-UA-Compatible: IE=EmulateIE7
Vary: Accept-Encoding
Content-Type: text/html; charset=EUC-JP
Set-Cookie: _lcp=cb3e60b072c4cd530997c605e3012dd8; domain=.mixi.jp; path=/; expires=Wed, 21-Nov-2012 06:05:22 GMT
X-Content-Type-Options: nosniff
Connection: close

リダイレクトの確認に、ヘッダー情報閲覧

curl -I オプションでヘッダーを見るのに一番重要なのがヘッダーの閲覧。正しくリダイレクトされているかが特に重要

takuya@air:~/Desktop$ curl -I https://google.com
HTTP/1.1 301 Moved Permanently
Location: https://www.google.com/
Content-Type: text/html; charset=UTF-8
Date: Wed, 21 Nov 2012 05:56:03 GMT
Expires: Fri, 21 Dec 2012 05:56:03 GMT
Cache-Control: public, max-age=2592000
Server: gws
Content-Length: 220
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN

BASIC 認証のページにアクセスする。 curl -u

これは通常のURL埋め込みでもいいようです

curl -u username:password http://www.example.com/member/
curl -basic username:password http://www.example.com/member/
curl  http://username:password @www.example.com/member/

証明書エラーが出るんだけど。 curl -k URL

SSL接続で証明書のエラーをスキップさせたかったら-k オプションを使う。

curl -k https://www.example.com/

一時的に使うんであればいいんではないでしょうか。


サーバーとのコネクション

サーバーとのコネクションやり取りを表示する。

takuya@air:~/Desktop$ curl -v mixi.jp
* About to connect() to mixi.jp port 80 (#0)
*   Trying 110.44.179.198...
* connected
* Connected to mixi.jp (110.44.179.198) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8r zlib/1.2.5
> Host: mixi.jp
> Accept: */*
> 
< HTTP/1.1 200 OK
< Date: Wed, 21 Nov 2012 06:02:43 GMT
< Server: Apache
< X-Dealer: 232035
< Cache-Control: no-cache
< Pragma: no-cache
< X-XRDS-Location: https://mixi.jp/xrds.pl
< X-UA-Compatible: IE=EmulateIE7
< Vary: Accept-Encoding
< Content-Type: text/html; charset=EUC-JP
< Set-Cookie: _lcp=fe0211c7f24909f35704108cfc568532; domain=.mixi.jp; path=/; expires=Wed, 21-Nov-2012 06:12:43 GMT
< X-Content-Type-Options: nosniff
< Connection: close
< Transfer-Encoding: chunked
< 

その他知っておくと便利な感じ

-# プログレスバーを表示
-s 不要なプログレスメータを出力しない

ファイルをFTPアップロードする。

以下コマンドはftpでアップロードするのと同様のことを実行する。

curl -T banner.jpg -u username:password ftp://ftp.example.com/static/imgs/

-Tの後にアップロードするファイルを指定。

別の書き方

ユーザ名、パスワードはURL書式に含めてしまってもいい。

curl -T banner.jpg -u  ftp://username:password@ftp.example.com/static/imgs/

ディレクトリごと取り出す

ftp://example.comの / ディレクトリごと取り出す。

 curl ftp://username:password@example.com/

証明書エラーは無視する。

証明書エラーは無視する

curl -k https://example.com/


no-check-certificate はないので、 -k



感想

curl って使われてないの?個人的にはすごく頻繁に使うのですが、wget に比べてマイナー感が否めない。


curl コマンドでHTTPファイルアップロード

Curlコマンドを使ってファイルをアップロードします。手軽で便利なので是非活用しましょう。

curl でファイルアップロード

curl -F name=value -F my_photo=@path_to_my_file http://example.com

構造はこんなかんじです。

curl -X POST  -F ${フォームinput名}=@${path_to_my_file} http://example.com

-X POST は指定しなくても、curl でファイルアップロード指定したら POST になります。

GETで送るなんて無茶もできる。

curl -X GET  -F ${フォームinput名}=@${path_to_my_file http://example.com}


MIME-Typeはマルチパートになる。multipart/form-datanなので、ファイルのタイプを指定しようとしたら次にようになる。


ファイルの種類を指定したアップロード

curl -X POST  -F ${フォームinput名}=@${path_to_my_file}:type=video/mp4 http://example.com

これで mime-type を指定したアップロード

強引なMIMEタイプを指定した結果がこちら。

f:id:takuya_1st:20190525183801p:plain

オプションについての説明

 -F で送信するフィールド名と値を指定する。
 @ マークでファイルを指定すると、multipart/form-data で送信される。


簡単ですね!!!

-F は複数重ね書きします。

curl -F name=value  -F name=value \
  -F name=value \
  -F name=@path_to_file \
  -F my_photo=@path_to_my_file \
http://example.com


PUX用に、multipart/form-dataで送信するクライアント書くと、ruby の動きが変だったので、CURLでアクセスしました。

2019-05-25

記述内容をおおきく更新

参考資料

man curl