2016/05/11

Linuxのコマンドとシェルによる連番生成方法

コマンド(seqjot)とシェル(BashZsh)を用いた連番生成方法についてを扱う。

元の記事は2008年5月に書かれたが、jotについての内容を追加し、更に一部の内容を修正している。

  1. seqコマンドによる連番の生成
    1. seqの出力フォーマット指定
    2. seqの区切り文字の変更
    3. seqの複数引数指定時の解釈
  2. jotコマンドによる連番の生成
    1. jotの出力フォーマット指定
    2. jotの区切り文字の変更
    3. jotの複数引数指定時の解釈
  3. シェルの機能を用いた連番の生成

seqコマンドによる連番の生成

GNU/Linuxでは、基本コマンド集Coreutilsに含まれるseqコマンドを使用することで簡単に連番を生成することができる。

基本的な使い方としては、引数を1つ付けることで、1から指定値までの連番を改行区切りで出力する。

(1から3までの連番を生成)
$ seq 3
1
2
3

seqの出力フォーマット指定

-wオプションを付けると、引数の値(連番の最大値)の桁数に合わせて、それよりも桁の少ない値に “0” を付ける(0埋めする)。

(0埋め有りで1から10までの連番を生成)
$ seq -w 10
01
02
03
...
08
09
10

上は

(2桁までに合わせる0埋め有りで1から10までの連番を生成)
$ seq -f %02g 10

としても同じ結果となるが、-fオプションではフォーマットを細かく指定できる。[1]

(連番URLの生成例)
$ seq -f http://www.example.com/img/%02g.jpg 10
http://www.example.com/img/01.jpg
http://www.example.com/img/02.jpg
http://www.example.com/img/03.jpg
...
http://www.example.com/img/08.jpg
http://www.example.com/img/09.jpg
http://www.example.com/img/10.jpg

これとwgetを組み合わせることで、連番ファイルのダウンロードが簡単に行える。

下は例だが、www.example.comは実在する上、実際には該当するURLの連番ファイルはないので、これは参考として実際には実行しないようにする。

(連番ファイルのダウンロード例だが、これは実際に実行しないように注意)
$ seq -f http://www.example.com/img/%02g.jpg 10 | wget -w 5 --random-wait -i -

seqの区切り文字の変更

区切りの文字は通常は改行文字となっているが、-sオプションを用いると、これを任意の文字に変更することができる。

(コンマを区切り文字にする例)
$ seq -s , 10
1,2,3,4,5,6,7,8,9,10

seqの複数引数指定時の解釈

引数を2つ指定して実行した場合はそれぞれを

  1. 開始値
  2. 終了値

と解釈する。

(5から10までの連番を生成)
$ seq -s , 5 10
5,6,7,8,9,10

0から始まる連番を生成する場合には1つ目の引数に “0” を指定する。

(0から2までの連番を生成)
$ seq 0 2
0
1
2

引数が3つの場合は順に

  1. 開始値
  2. 加算値
  3. 終了値

と解釈する。

(10から2刻みで20までの値を生成)
$ seq -s , 10 2 20
10,12,14,16,18,20

加算値(2番目の引数)は負の値でもよいが、開始値から加算を繰り返しても終了値に到達しないような引数の組み合わせを指定すると何も表示されない場合がある。

(開始値から終了値まで値が生成される例)
$ seq -s , -f %.2f 5 -1.25 -5
5.00,3.75,2.50,1.25,0.00,-1.25,-2.50,-3.75,-5.00

(開始値と終了値が同じ例)
$ seq -s , 5 -1 5
5

(終了値に到達しない例)
$ seq -s , 5 -1 10
(何も表示されない)

(終了値に到達しない例2)
$ seq -s , 10 1 5
(何も表示されない)

なお、1ずつ数字を減らす連番が作りたい場合でも、2つ目の引数に “-1” を指定して3つの引数を渡さないと、何も表示されない。

(10から5までの連番を生成)
$ seq -s , 10 -1 5
10,9,8,7,6,5

(間違った指定例)
$ seq -s , 10 5
(何も表示されない)

jotコマンドによる連番の生成

BSD系のOSで使用でき、連番生成機能を含む多目的コマンドjotは、GNU/Linuxでもディストリによってはパッケージとしてインストール可能で、Debian/Ubuntuでは “athena-jot” という名前でインストールできる。

引数を1つだけ指定したときの動作はseqと同様。

jotの出力フォーマット指定

-wオプションで出力フォーマット指定が可能で、フォーマット部分の書式はC言語のprintf()系関数と同様となる(seqコマンドとは異なる)。

(フォーマットの指定例)
$ jot -w http://www.example.com/img/%02d.jpg 10
http://www.example.com/img/01.jpg
http://www.example.com/img/02.jpg
...
http://www.example.com/img/09.jpg
http://www.example.com/img/10.jpg

jotの区切り文字の変更

jotの連番生成時における区切り文字の扱いはseqと同様で、-sオプションで任意の文字が指定できる。

jotの複数引数指定時の解釈

引数を2つ指定して実行した場合はそれぞれを

  1. 出力される値の個数
  2. 開始値

と解釈する。

(7から始まる3つの値を出力)
$ jot -s , 3 7
7,8,9

0から始まる連番を生成する場合には2つ目の引数に “0” を指定する。

(0から始まる3つの値を出力)
$ jot -s , 3 0
0,1,2

引数が3つの場合は

  1. 出力される値の個数
  2. 開始値
  3. 終了値

と解釈する。

(11から13までの3つの値を出力)
$ jot -s , 3 11 13
11,12,13

開始値よりも終了値のほうが低い場合は値が減っていくが、小数点以下の指定桁数によっては出力される値の並びが等間隔にならない場合がある。

(必要な桁数が含まれている例)
$ jot -s , 9 5.00 -5.00
5.00,3.75,2.50,1.25,0.00,-1.25,-2.50,-3.75,-5.00

(必要な桁数が含まれていない例)
$ jot -s , 5 0 1
0,0,0,1,1
$ jot -s , 5 0.0 1.0
0.0,0.2,0.5,0.8,1.0

シェルの機能を用いた連番の生成

BashZshといった端末シェルでは、波括弧と “..” を用いた記法を用いて整数の連番を含んだ引数をコマンドへ渡すことができる。値が増える連番と減る連番の両方に対応しており、桁数を合わせるための “0” を付ける[2]こともできる。

(値が増える連番・0埋めなし)
Bash/Zsh$ echo {8..10}
8 9 10

(値が減る連番・0埋めあり)
Bash/Zsh$ echo {10..08}
10 09 08

(月の値の名前のディレクトリ一括作成における使用例)
Bash/Zsh$ mkdir -p 2016/{01..12}
Bash/Zsh$ ls -F 2016
01/  02/  03/  04/  05/  06/  07/  08/  09/  10/  11/  12/
使用したバージョン:
  • Coreutils 8.25
  • athena-jot 9.0
  • Bash 4.3
  • Zsh 5.1.1
[1]: フォーマット文字列の扱いはC言語のprintf()系関数に近いが同一ではなく、整数の “%g” と小数の “%f” を基本とする
[2]: Zshではかなり前から対応しているが、バージョン3系までのBashは対応していなかった