/mnt/raid/skymonitor/pub には,岡山大学で撮影した空の写真が置いてある.
まずはディレクトリを見てみる
$ cd /mnt/raid/skymonitor/pub $ ls 2016 2019 CAMSTAT latest.jpg test yesterday.gif 2017 2020 atmoptics obsnum.dat unidentified yesterday.mp4 2018 2021 instrument obsnum.png windshear
なんの説明もないが,写真は撮影した年ごとに分けて保存されていると,なんとなく予想される.
$ cd 2019 $ ls 01 02 03 04 05 06 07 08 09 10 11 12
月ごとに分けられているっぽい.
$ cd 07 $ ls
さらに日ごとに分けられているようだとわかる.
$ cd 20190725 $ ls
ファイル名を見ると,撮影日時がファイル名になっているらしい(ということくらいは,説明がなくてもわかって欲しい).
JPEG形式の画像は display コマンドで見ることができる
$ display 201907250000.jpg
ファイル名から深夜0時の写真と予想され,開いてみると夜の空っぽい画像が出てくる.中央やや右に写っている白い点は星(よく見ると他にもいくつか星が写っている).画面の下の方は白っぽくなっているのは,雲が出ているため(たぶん).左上にある数字は撮影の日付と時刻を表している(たぶん).違う時刻の写真も開いてみる.
$ display 201907251500.jpg
いろんな時刻の写真を見てみると,この日は午前中は曇っていて,午後はだんだん雲が少なくなっていったことがわかる.
ちなみに,20:13に撮影された画像には火球(かなり明るい流れ星)が写っている.
ファイル名から想像するに,写真は1分おきに撮影されている.ということは,このディレクトリには1440枚の写真が保存されていると予想される(1440がどこから出てきたかわかりますよね? 1日は24時間,1時間は60分,なので1日は24x60=1440分).実際に1440枚の写真があるのかどうか数えてみる.
1440個も数えるのは面倒だと思う.そう思うのは正しい(というか,面倒だと思わない人はたぶん何か間違っている).面倒なことは機械にやってもらったらよい.
まず,練習.
$ cd /mnt/raid/skymonitor/pub/2019 $ ls 01 02 03 04 05 06 07 08 09 10 11 12
このディレクトリにはファイルが12ある. ここで
$ ls | wc -l
とすると
12
と出力される. ここではパイプという技を使って,ふたつのコマンドを接続している.上の例では,最初に ls というコマンドでファイルの一覧を出力し,その出力をパイプ(|)によって wc -l というコマンドに渡している.wc -l は数を数える(正確には行数を数える)コマンドである.パイプを表す文字 | は縦の線,wc -l の l は小文字のエル,である.
$ cd 07 $ ls | wc -l 31
7月は31日まであるので,31個のファイル(ディレクトリ)があることが期待され,実際に31個あると確認することができる.
ディレクトリ 20190725 にあるファイルの数を数えてみる.
$ cd 20190725 $ ls | wc -l 1442
予想は1440だが,実際には1442となった. ファイルの一覧をもう一度見てみる.
$ ls
いちばん後ろに TempCPU.txt という名前のいかにも写真ではない感じのファイルがある.これは観測装置のCPU温度を記録したファイルで,たしかに写真のファイルではない(気になる人は cat などのコマンドを使ってファイルの中身を見てみるとよい.CPU温度(摂氏)を1000倍した数値が記録されている).
あともうひとつ,写真じゃないファイルがあるのだが,それは簡単には見つからないかもしれない.ファイル数が多くなると,ls でファイルの一覧を表示したとき,画面に全てのファイル名を表示しきれなくなることがある.そういうときは,パイプを使って less につなぐ.
$ ls | less
less は1ページに収まらないデータを,1ページずつ表示してくれる.「スペース」キーを押すと次ページを表示,「Q」のキーを押す(小文字の q を入力する)と終了する. less を使ってよく見ると,20190725.mp4 というファイルがあるとわかる.これは1日の間に撮影された静止画をつなげて作った動画のファイル(mp4形式)である.
他は全て写真のファイルで,それらは全部で1440枚と確認することができる.
ちなみに,写真のファイルは拡張子(ファイル名の最後(.の後ろ)に付く文字列)がjpgになっている. 後述するワイルドカードを使うと,以下で拡張子がjpgのファイルの数を数えることができる.
$ ls *.jpg | wc -l 1440
「*」や「?」はワイルドカードと呼ばれ,特殊な機能な持つ. ファイル名を指定するときに * や ? を使うと,以下の規則に従って展開される.
ワイルドカードを使うことで,複数のファイルをまとめて指定して処理することができる.
再び,ファイルの数を数えてみる. 2019年7月25日の12時10分台(12:10-12:19)に撮影された写真の数を数える.
$ cd /mnt/raid/skymonitor/pub/2019/07/20190725 $ ls 20190725121*.jpg 201907251210.jpg 201907251213.jpg 201907251216.jpg 201907251219.jpg 201907251211.jpg 201907251214.jpg 201907251217.jpg 201907251212.jpg 201907251215.jpg 201907251218.jpg
時刻を表す下4桁のうち,12時10分台は最初の3桁が121となり,最後の1桁はどんな数字でもよい.どんな数字でもよいという部分をワイルドカードに置き換えることで,12時10分台に撮影された全てのファイルを指定している.
10個くらいであれば人力で数えてもよいが,いちおう機械に数えてもらう.
$ ls 20190725121?.jpg | wc -l 10
同様にして,12時台(12:00-12:59)に撮影されたファイルは,以下のようにして数えたらよい.
$ ls 2019072512??.jpg | wc -l
ちゃんと 60 と出ましたか? ここは
$ ls 2019072512* | wc -l
でもよい.
以下の例は何を数えることになるか考えてみる. 予想が正しいかどうか確認する.
$ ls 20190725*10.jpg $ ls 20190725*10*.jpg
どうなっているのかわからないという人は,
$ ls 20190725*10.jpg | less $ ls 20190725*10*.jpg | less
としてみると,わかるかもしれない.
空の写真は電気仕掛けで自動的に撮影している. 正しく動作すれば毎日1440枚の写真が撮影されるが,正しく動作しないこともある. 例えば,2019年7月26日は1116枚しか撮影されていない.
$ cd /mnt/raid/skymonitor/pub/2019/07/20190726 $ ls *.jpg | wc -l 1116
どこで欠測したのか調べてみる. ファイルの一覧を表示して,隅から隅まで見ればどの時刻で欠測したのかわかるが,面倒なことは機械にやらせるという方針で,機械を使ってて探してみる. 例えば
$ ls 2019072600*.jpg | wc -l 60
0時台は60枚の写真が撮影されており,欠測はないとわかる. 一方
$ ls 2019072612*.jpg | wc -l 38
ということで,12時台は60未満であり,欠測したことがわかる.
少ない手数で欠測した時刻を調べる方法を考えるのもいいかもしれない. ちなみに,2019年7月23日にも欠測がある. どの時刻で欠測したのか調べてみる.
ファイルのコピーは
$ cp file1 file2
これは file1 のコピーを file2 という名前で作る. コマンドを実行すると,file1 と中身が全く同じ file2 が生成する. file1 と file2 は相対パスで書いてもよいし,絶対パスで書いてもよい.
ファイルが存在していても,コピーできるとは限らない. 例えば,
$ cd /mnt/raid/skymonitor/pub/2019/07/20190725 $ cp 201907252013.jpg meteor.jpg
とすると,以下のようなメッセージが表示される.
cp: cannot create regular file 'meteor.jpg': Permission denied
これは,カレントディレクトリ(/mnt/raid/skymonitor/pub/2019/07/20190725)にある201907252013.jpg というファイルのコピーを,カレントディレクトリにmeteor.jpgという名前で作る,というコマンドであるが,Permission denied と言われて,コピーを作ることに失敗している. コピーが作成されていないことを確認する.
$ ls
コマンドが実行されていたら meteor.jpg が生成するが,コマンドの実行に失敗しているので meteor.jpg は表示されないはずである.
ここでコピーを作ることに失敗したのは,カレントディレクトリにファイルを作成する権限がないからである. ディレクトリの情報を表示する
$ ls -l /mnt/raid/skymonitor/pub/2019/07
20190725以外にもたくさん表示されるが,数字の順番に並んでいるので20190725はすぐに見つかる.所有者は george で,その他にwriteの許可がないことがわかる.
自分が所有者のディレクトリにコピーをつくってみる. まず,ホームディレクトリに移動.
$ cd $ pwd
ホームディレクトリにあるファイルを表示する.
$ ls
meteor.jpg が存在しないことを確認したら(meteor.jpgが存在しているなら,次のコマンドはmetor.jpgを別の名前に置き換えて実行する),
$ cp /mnt/raid/skymonitor/pub/2019/07/20190725/201907252013.jpg meteor.jpg
これは /mnt/raid/skymonitor/pub/2019/07/20190725/201907252013.jpg のコピーを,meteor.jpg という名前でつくる,という命令になる. コピーが作られたことを確認する.
$ ls
meteor.jpg がコピーであることを確認するなら,
$ display /mnt/raid/skymonitor/pub/2019/07/20190725/201907252013.jpg & $ display meteor.jpg &
コピーでは,コピーを作る先としてファイル名でなくディレクトリを指定することもできる. コピーする先としてディレクトリを指定すると,指定したディレクトリの下に元のファイルと同じ名前のファイルが生成する. 例えば,
$ mkdir sky
とやって,カレントディレクトリに sky というディレクトリを作成し,コピー先にディレクトリを指定してコピーを実行すると
$ cp /mnt/raid/skymonitor/pub/2019/07/20190725/201907252013.jpg sky
ディレクトリ sky の下に 201907252013.jpg という名前のファイルが生成する. 確認する
$ cd sky $ ls 201907252013.jpg
ここで,先と同じコマンドを実行してみる
$ cp /mnt/raid/skymonitor/pub/2019/07/20190725/201907252013.jpg sky
このときは sky というディレクトリが存在しないので,コピー先はファイル名と解釈されて,sky という名前のファイルが作られる. 確認すると,
$ ls 201907262013.jpg sky
ちなみに,sky は /mnt/raid/skymonitor/pub/2019/07/20190725/201907252013.jpg のコピーなので,画像である(skyというファイル名は画像っぽくは見えなかったとしても).
$ display sky &
とやってみれば,/mnt/raid/skymonitor/pub/2019/07/20190725/201907252013.jpg と同じ画像が表示される.
ちなみに,ディレクトリの指定には . や .. なども使うことができる.例えば
$ mkdir meteor $ ls 201907252013.jpg meteor sky $ cd meteor $ ls
ここで
$ cp /mnt/raid/skymonitor/pub/2019/07/20190725/201907252013.jpg . $ ls 201907252013.jpg
ということで,カレントディレクトリにコピーが作られる.
不要なファイルを削除する.
まずはホームディレクトリに移動して,ファイル一覧を表示
$ cd $ ls meteor.jpg sky
ここで meteor.jpg を消去する. ファイルを削除するコマンドは rm
$ rm meteor.jpg
確認する
$ ls sky
次に sky を削除する. ディレクトリを削除するコマンドは rmdir だが,やってみると
$ rmdir sky rmdir: failed to remove 'sky': Directory not empty $ ls sky
ということで,ディレクトリの削除に失敗する. rmdir とした後に出たメッセージに Directory not empty とあるので,ディレクトリが空っぽじゃなかったので削除できなかったのだとわかる.
$ ls sky 201907262013.jpg meteor sky
たしかに,ディレクトリ sky の下にファイル(ディレクトリを含む)がある. これらのファイルをひとつずつ削除した後で,ディレクトリ sky を削除してもよいのだが,
$ rm -r sky
のように,オプション -r を付けて rm すると,ディレクトリをまるごと削除することができる.
$ ls
ということで,sky とそのディレクトリの下にあったファイルが全て削除される.