2017年3月22日

古いファイルのタイムスタンプを表示するには?(lsコマンド)

lsコマンドでは、ファイルのタイムスタンプが古いものは時刻表示がカットされ、年月日のみが表示されます。

$ ls -l /bin/cat
-rwxr-xr-x 1 root root 47904  3月 11  2016 /bin/cat

より詳細な時刻を知りたいときは、--full-timeオプションを追加します。

$ ls -l --full-time /bin/cat
-rwxr-xr-x 1 root root 47904 2016-03-11 04:10:57.000000000 +0900 /bin/cat



2017年3月21日

ディレクトリの役割を調べるには(man hier)

Linuxのディレクトリ階層は、FHS(ファイルシステム階層標準)として仕様が定められています。ディレクトリにどんな役割があるのか確認したいときは、次のコマンドを実行します。

$ man hier

このようなmanページが表示されます。




2017年3月20日

16進数を10進数に変換するには?(echoコマンド)

16進数を10進数に変換したいときは電卓アプリなどを使えばいいのですが、ちょっとした確認のためだけに起動するのは面倒です。Bashの算術式展開を使うと、16進数を10進数に変換して表示することができます。

【書式】$((0xHEX))

HEXの位置に16進数を記述します。次の例では、FFF(16)を10進数に変換しています。

$ echo $((0xfff))
4095



2017年3月19日

連番を生成するには?(seq文)

seqコマンドを使うと、連続した数値のリストを生成できます。

【書式】seq 開始値 [増分] 終了値

次の例では、1~5の数値を生成します。

$ seq 1 5
1
2
3
4
5

次の例では、1~20の数値を5飛ばしで生成します。

$ seq 1 5 20
1
6
11
16

seqコマンドは、シェルスクリプト内のfor文などで使われます。単体で使うことはあまりないでしょう。



2017年3月18日

lsコマンドのカラム数を調整するには?(prコマンド)

lsコマンドで表示されるカラム数(列)は、端末の幅によって変化します。書式を整えるprコマンドと組み合わせると、カラム数を調整することができます。

例えば、横5列で表示したい時は、次のようにします。-Tはヘッダや余白を省略するオプションです。

$ ls | pr -5 -T
a1.txt        b1.txt        c1.txt        d1.txt        e1.txt
a2.txt        b2.txt        c2.txt        d2.txt        e2.txt
a3.txt        b3.txt        c3.txt        d3.txt        e3.txt
a4.txt        b4.txt        c4.txt        d4.txt        e4.txt
(省略)

今度は横5列で、かつページ幅を40文字としてみます。

$ ls | pr -3 -T -w 40
a1.txt       b7.txt       d4.txt
a2.txt       b8.txt       d5.txt
a3.txt       b9.txt       d6.txt
a4.txt       c1.txt       d7.txt
(省略)


2017年3月17日

シェルスクリプトで処理を一定の回数くりかえすには?(for文)

Bashのfor文は、C言語やJavaに慣れた人にとっては違和感があるでしょう。安心してください。C言語やJavaのような使い方もできます。次の例では、1~9までの数値を表示します。

#!/bin/bash
for ((i=1; i<10; i++))
{
  echo $i;
}

echo文の末尾に「;」はなくてもよいのですが、あえてC言語っぽく書きました。うっかり「i=1」を「i = 1」のように「=」前後にスペースを入れないよう気をつけてください。


2017年3月16日

シェルスクリプトでループ処理をするには?(for文)

for文は、値リストに並んだ値を変数に代入しつつ、do~doneのループを繰り返します。値リストは、スペースで区切られた文字列です。値リストが尽きれば、ループは終了します。

for 変数 in 値リスト
do
  処理
done

次の例では、1~10までの数値を変数に代入しつつループ処理を行います。

#!/bin/bash
for i in 1 2 3 4 5 6 7 8 9 10
do
  echo $i
done

実行してみます。

$ bash fortest.sh
1
2
3
4
5
6
7
8
9

数が大きいときは、連続した数値を生成するseqコマンドを使った方がよいでしょう。

#!/bin/bash
for i in $(seq 1 9)
do
  echo $i
done

「$(コマンド)」は、括弧内のコマンドを実行してその結果に置き換える、という意味です。

2017年3月15日

ホームディレクトリの容量を調べるには?(duコマンド)

ディレクトリ内にどのくらいのファイルが保存されているのか、その容量を調べたい時は、duコマンドを使って次のように調べます。

$ du -scm ~
931     /home/north
931     合計

-sは指定したディレクトリのみを対象とするオプション、-cは合計を表示するオプション、-mは単位をMバイトで表示するオプションです。上記の例では、ホームディレクトリ内で931Mバイトが使われていることが分かります。



2017年3月14日

ファイルの種類を確認するには?(fileコマンド)

fileコマンドを使うと、ファイルの種類を確認することができます。

$ file /etc/hosts
/etc/hosts: ASCII text
$ file abc.jpg
abc.jpg: JPEG image data, JFIF standard 1.02
$ file exdir.tar
exdir.tar: POSIX tar archive (GNU)
$ file exdir.tar.bz2
exdir.tar.bz2: bzip2 compressed data, block size = 900k
$ file /bin/ls
/bin/ls: ELF 64-bit LSB  executable, x86-64, version 1 (SYSV), 
dynamically linked (uses shared libs), for GNU/Linux 2.6.24, 
BuildID[sha1]=8d0966ce81ec6609bbf4aa439c77138e2f48a471, stripped

上から順に、テキストファイル、JPEG画像ファイル、TARアーカイブファイル、bzip2圧縮ファイル、実行ファイルとなっています。


2017年3月13日

連続する文字列を生成するには?(ブレース展開)

Bashでは、記号{}を使って連続する文字列を生成できます(ブレース展開)。次の例では、1~10までの連番を生成します。

$ echo {1..10}
1 2 3 4 5 6 7 8 9 10

次の例では、aからgまでのアルファベット文字列を生成します。
$ echo {a..g}
a b c d e f g

複数の空ファイルを作成したいときなどに便利です。次の例では、touchコマンドを使い、a1.txt~e9.txtまで45個のファイルを生成しています。

$ touch {a..e}{1..9}.txt
$ ls
a1.txt     b1.txt     c1.txt     d1.txt     e1.txt
a2.txt     b2.txt     c2.txt     d2.txt     e2.txt
a3.txt     b3.txt     c3.txt     d3.txt     e3.txt
a4.txt     b4.txt     c4.txt     d4.txt     e4.txt
a5.txt     b5.txt     c5.txt     d5.txt     e5.txt
a6.txt     b6.txt     c6.txt     d6.txt     e6.txt
a7.txt     b7.txt     c7.txt     d7.txt     e7.txt
a8.txt     b8.txt     c8.txt     d8.txt     e8.txt
a9.txt     b9.txt     c9.txt     d9.txt     e9.txt



2017年3月12日

シェルスクリプトでループ処理をするには?(while文)

while文は、条件式が満たされている間、do~doneの処理を繰り返します。

while 条件式
do
  処理
done

次の例では、変数iをループ変数とし、iが10以下の間ループ処理をします。

#!/bin/bash
i=1
while [ $i -le 10 ]
do
  echo $i
  i=$((i+1))
done

下から2行目で算術式展開を使って変数iの値をインクリメントしています。これを実行すると、次のようになります。

$ bash whiletest.sh
1
2
3
4
5
6
7
8
9
10

もう一つ、例を見ておきましょう。次のシェルスクリプトは、ファイルsample.txtを1行ずつ読み込み、読み込んだ行を変数lineに代入してループを回します。doneの後に入力リダイレクトでファイルを指定している点に注意してください。

#!/bin/bash
while read line
do
  echo $line
done < sample.txt



2017年3月11日

シェルスクリプトでif文を使うには?

条件判定の定番if文。もちろんBashでも使えます。基本的な構文は次のとおりです。

if 条件式
  then
    条件式が真の場合の処理
  else
    条件式が偽の場合の処理
fi

インデントは不要ですが、読みやすくするために入れた方がよいでしょう。末尾を「fi」で締めるのをお忘れなく。条件式にはtestコマンド([ ])がよく使われます。

例を見ておきましょう。ログイン時の初期化ファイル~/.profileを見てみます。

if [ -f "$HOME/.bashrc" ]; then
    . "$HOME/.bashrc"
fi

-fはファイルの存在判定です。ホームディレクトリに「.bashrc」ファイルがあれば(ファイルの存在が真ならば)、「.」コマンド(sourceコマンド)を使って.bashrcファイルの処理を実行します。

if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

これも~/.profileに登場するif文です。-dはディレクトリの存在判定です。ホームディレクトリに「bin」ディレクトリがあれば、PATH変数に「$HOME/bin」を追加します。



2017年3月10日

telnetを利用するには?(telnetコマンド)

telnetコマンドを利用するには、telnetパッケージをインストールします。

$ sudo apt install telnet

使い方は、次のとおりです。

【書式】telnet 接続先ホスト [ポート番号]

次の例では、192.168.1.10のホストにtelnetで接続しログインを試みます。接続先サーバーではもちろんtelnetサービスが稼働している必要があります。

$ telnet 192.168.1.10

現在では、telnetによるログインサービスが実施されていることはほとんどないでしょう。通信が暗号化されないなど、セキュリティ的に危険だからです。しかし、サーバーの動作確認などに使われていることがあります。Webサーバーに接続して直接HTTPメソッドを実行したり、メールサーバーに接続してSMTPやPOPを使ったりすることができます。次の例では、192.168.1.10のWebサーバー(80番ポート)に接続し、GETメソッドを実行しています。

$ telnet 192.168.1.10 80
Trying 192.168.1.10...
Connected to 192.168.1.10.
Escape character is '^]'.
GET /index.html HTTP/1.0

HTTP/1.1 200 OK
Date: Tue, 7 Mar 2017 10:55:54 GMT
Server: Apache
Last-Modified: Tue, 14 Jan 2014 09:41:51 GMT

(省略)



2017年3月9日

シェルスクリプトで対話的にデータを入力するには?(readコマンド)

readコマンドを使うと、シェルスクリプト内で対話的にデータを取り込むことができます。

【書式】read [-p "メッセージ"] 変数名

次のようなシェルスクリプトyourname.shを用意します。

#!/bin/bash
read -p "Your Name? : " name
echo "Hello ${name}!"

実行してみます。入力した文字列は変数nameに格納されます。

$ bash yourname.sh
Your Name? : Nakajima
Hello Nakajima!



2017年3月8日

シェルスクリプト内で引数を利用するには?

シェルスクリプトを実行する際に引数を指定し、シェルスクリプト内で使うことができると便利です。シェルスクリプトの引数は、位置パラメータという特殊な変数に格納されます。

位置パラメータ説明
$1 1番目の引数
$2 2番目の引数(以下$3、$4...と続く)
$# 指定された引数の数
$@ すべての引数(スペース区切り)

簡単なシェルスクリプトで確認してみましょう。argstest.shというシェルスクリプトを用意します。

#!/bin/bash
echo '$1 = '$1
echo '$2 = '$2
echo '$3 = '$3
echo '$# = '$#
echo '$@ = '$@

実行してみます。

$ source argstest.sh foo bar
$1 = foo
$2 = bar
$3 =
$# = 2
$@ = foo bar

引数は2つしか指定しなかったので、3番目の引数を示す$3には何も入っていないのが分かります。


2017年3月7日

シングルクォートとダブルクォートの違いは?

Bashでは、シングルクォート(')とダブルクォート(")は区別されています。どちらもクォーテーション内を文字列として扱う記号ですが、文字列内の特殊記号(メタキャラクタ)の扱いが異なります。

例えば、Bashで文字列の頭に「$」を付けると変数への参照として扱われますが、シングルクォート内では「$」記号として扱われます。

$ echo "$USER"
north
$ echo '$USER'
$USER

文字列内でダブルクォートを使うためには、特殊記号としての意味を打ち消すため、バックスラッシュ記号(\)を付ける必要があります(エスケープシーケンス)。

$ echo "echo \"Hello, world.\""
echo "Hello, world."

一方、シングルクォート内では、ダブルクォート記号もそのまま使えます。

$ echo 'echo "Hello, world."'
echo "Hello, world."

簡単に言えば、引用符内の文字をすべて文字列として扱いたい時にはシングルクォートを使うようにするとよいでしょう。

2017年3月6日

端末上でストップウォッチを使うには(timeコマンド)

コマンドの実行時間を計測するtimeコマンドを使うと、簡単なストップウォッチを用意できます。次のコマンドを実行した瞬間にストップウォッチがスタートします。

$ time read -s

Enterキーを押すと、カウントが終了します。

$ time read -s

real    0m4.384s
user    0m0.000s
sys     0m0.000s



2017年3月5日

ファイルの内容をクリアするには?

ファイルを削除するのではなく、ファイルの内容を消してしまうには、次のようにするとよいでしょう。

$ > samplefile

ファイルサイズは0になります。

$ ls -l samplefile
-rw-r--r-- 1 north north 0  3月 3 19:30 samplefile



2017年3月4日

rar形式のファイルを解凍するには?(unrarコマンド)

ファイルの拡張子が「.rar」のファイルを解凍するには、あらかじめunrarコマンドをインストールしておく必要があります。

$ sudo apt install unrar

次の例では、sample.rarファイルを解凍します。「e」コマンドでカレントディレクトリに解凍されます。

$ unrar e sample.rar


2017年3月3日

ファイル名で検索するには?(findコマンド)

ファイルを名前で検索するには、findコマンドを使います。

【書式】find [検索ディレクトリ] -name ファイル名

検索ディレクトリには、検索を開始するトップディレクトリを指定します(省略するとカレントディレクトリ)。ファイル名は「"*.txt"」のようにワイルドカードを使って指定できます。その際は「"」でくくってください。次の例では、カレントディレクトリ以下から、ファイル名の末尾が「.c」のファイルを検索します。

$ find -name "*.c"

findコマンドは、ファイルだけではなくディレクトリも検索します(Linuxではディレクトリもファイルの一種です)。次の例では、ファイル名またはディレクトリ名の一部に「image」があるファイルやディレクトリを検索します。

$ find -name "*image*"
./Data/image.png
./images
./images2
./images3
./images4
./images5
./www/blue/images

検索対象をファイルだけに限定するには「-type f」を指定します(ディレクトリなら「-type d」)。

$ find -name "*image*" -type f
./Data/image.png

findコマンドはとても多機能なコマンドです。まずは基本的な使い方を覚えるとよいでしょう。



2017年3月2日

エディタを使わずにファイルを作成するには?(catコマンド)

catコマンドは標準入力から文字列(テキストストリーム)を受け取ります。これを利用して、

【書式】cat > ファイル名

という形で、複数行のテキストファイルを生成できます。入力を終えるには[Ctrl]+[D]キーを押します。ちょっとしたシェルスクリプトなどを作成するのに便利です。

$ cat > testfile.sh
echo -n "Who are you? "
read username
echo "Hello, $username!"

ファイルの内容を確認してみます。

$ cat testfile
echo -n "Who are you? "
read username
echo "Hello, $username!"

なお、ヒアドキュメントという入力リダイレクトを使う方法もよく紹介されていますが、変数が展開されてしまう点に注意が必要です。次の例を見てください。

$ cat > testfile << EOF
> echo $PATH
> $(date)
> EOF
$ cat testfile
echo /home/north/.nvm/versions/node/v7.4.0/bin:/home/north/.rbenv/shims:/home/north/.rbenv/bin
:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/usr/local/go/bin
2017年  3月 2日 水曜日 19:05:00 DST

指定した文字列(ここではEOF)を入力するまで続けて入力できますが、変数やコマンドが展開されてしまっています。最初に挙げた方法であれば、変数は展開されず、そのままファイルに書き出せます。

$ cat > testfile
echo $PATH
$(date)
$ cat testfile
echo $PATH
$(date)



2017年3月1日

ファイル作成時のデフォルトパーミッションを設定するには?(umaskコマンド)

ファイルやディレクトリを作成したときにデフォルトで設定されるパーミッションは、umask値で決まります。umask値とは「0022」といった数値です。ファイルであれば「666」から、ディレクトリであれば「777」からumask値を引いた値がデフォルトパーミッション(数値)になります。umask値が「0022」であれば、ファイルは「666-0022」=「644(rw-r--r--)」、ディレクトリは「777-0022」=「755(rwxr-xr-x)」となります。

$ touch testfile
$ mkdir testdir
$ ls -l
合計 0
drwxr-xr-x 2 north north 0  2月 23 21:47 testdir
-rw-r--r-- 1 north north 0  2月 23 21:47 testfile

現在のumask値は、umaskコマンドを実行すると表示されます。

$ umask
0022

umask値の設定は、~/.bashrcファイルで行います。このファイルに、次のような設定を記述しておきましょう。変更は、次回ログイン時から適用されます。

umask=0022