home(h) links(l) memo translation(t) profile(r)
memo(m) unix関係

メモ〜UNIX関係

OS個別の事項について

アルファベット順コマンド一覧

a

b

c

d

e

f

g

h

i

k

l

m

n

p

r

s

t

u

v

w

y

z

0-9

ファイル操作関係

ファイル名一覧を表示(ls

lsはファイル名一覧を表示する。

【書式】
ls オプション ファイルパターン,ファイルパターン...
ファイルパターン
ワイルドカードなどを記すとその内容を解釈して得られた結果を返す。
$ echo mom16?_ja.hml
mom160_ja.html mom161_ja.html mom162_ja.html mom163_ja.html mom164_ja.html
$ echo mom1[01]?_ja.html
mom100_ja.html mom101_ja.html mom102_ja.html mom103_ja.html mom104_ja.html mom105_ja.html mom106_ja.html mom107_ja.html mom108_ja.html mom109_ja.html mom110_ja.html mom111_ja.html mom112_ja.html mom113_ja.html mom114_ja.html mom115_ja.html mom116_ja.html mom117_ja.html mom118_ja.html mom119_ja.html
-1
--format=single-column
1行にファイル・ディレクトリ名を1つずつ出力する。標準出力が端末でない場合はこれが既定値。
-A
--almost-all
自己ディレクトリ(.)と親ディレクトリ(..)を除いた隠しファイルやディレクトリも表示する。
-a
--all
自己ディレクトリ(.)と親ディレクトリ(..)も含めた隠しファイルやディレクトリも表示する。
-B
--ignore-backups
コマンドラインで指定した場合を除き、「~」で終わるファイルをリストから除外する。
-c
並べ替え(-t)や詳細情報表示(-l)の際、最終修正時刻ではなく最終状態変更時刻を用いる。
--color=when
ファイルタイプを区別するための色づけの有無を指定する。色は環境変数 LS_COLORS を用いて指定される。この変数の設定法についての情報は dircolors(1) を参照すること。 when は省略できる。以下のいずれか 1 つを指定することもできる:
  • none まったく色をつけない。これがデフォルトである。
  • auto 標準出力が端末の場合のみ色づけする。
  • always 常に色をつける。 --color を指定して when に何にも指定しないのは --color=always と等しい。
-d
--directory
引数がディレクトリの場合、ディレクトリそのものの情報について表示する(子ディレクトリの情報まで再帰的に表示することはしない)。
-F
ファイル・ディレクトリ名の末尾に種類を示す文字列を付加して結果出力(/:ディレクトリ、*:実行可能ファイル、@:シンボリックリンクなど)
-G
カラー化出力を有効にする(環境変数CLICOLORの定義と同様)
-H
--si
ファイルサイズをキロ、メガなどの接頭辞を使って表示。キロ=1000
-h
--human-readable
ファイルサイズをキロ、メガなどの接頭辞を使って表示。キロ=1024
-i
--inode
inode番号表示
-k
--kilobytes
ファイルサイズをキロバイト単位で表示。
-L
--dereferance
シンボリックリンクファイルの場合、シンボリックリンクファイルの情報ではなくリンク先のファイルの情報を表示する。
【例】
$ ls -l 148l-noatom.xml.gz
lrwxrwxrwx 1 rcsb rcsb    46 12月 13  2009 148l-noatom.xml.gz -> ../../divided/XML-noatom/48/148l-noatom.xml.gz
$ ls -lL 148l-noatom.xml.gz
-rw-r--r-- 1 rcsb rcsb 18101  2月 27 01:10 148l-noatom.xml.gz
-l
ファイルのアクセス権、所有者、サイズ、最終修正時刻(最近のファイルの場合)または最終修正年月日(古いファイルの場合)を表示。時刻については-cオプション、-uオプションを使うと、それぞれ最終状態変更時刻、最終アクセス時刻を表示する。ファイルの時刻が6ヶ月以上前、または1時間以上先の場合タイムスタンプは時刻の代わりに年が入る。
-p, --file-type, --indicator-style=file-type
-Fと同様にファイル・ディレクトリ名の末尾に種類を示す文字列を付加するが、実行可能ファイルにはマークしない。
-R, --recursive
サブディレクトリの情報も表示する。
-r, --reverse
逆順出力。
shell> ls -l ←アルファベット昇順(大文字→小文字)
-rw-r--r-- 1 user user 89792246  3月 21 14:29 XYZ.txt
-rw-r--r-- 1 user user  8293402  4月  1 04:02 abc.csv
-rw-r--r-- 1 user user    49329  3月 27 13:04 def.txt
-rw-r--r-- 1 user user   202421  4月 12 10:29 klmnop.txt
-rw-r--r-- 1 user user   158362  2月 20 16:17 zhogehoge
shell> ls -ltr ←古い順
-rw-r--r-- 1 user user   158362  2月 20 16:17 zhogehoge
-rw-r--r-- 1 user user 89792246  3月 21 14:29 XYZ.txt
-rw-r--r-- 1 user user    49329  3月 27 13:04 def.txt
-rw-r--r-- 1 user user  8293402  4月  1 04:02 abc.csv
-rw-r--r-- 1 user user   202421  4月 12 10:29 klmnop.txt
-S, --sort=size
ファイルサイズの大きい順に出力(-r も付けると小さい順)。
shell> ls -l ←アルファベット昇順(大文字→小文字)
-rw-r--r-- 1 user user 89792246  3月 21 14:29 XYZ.txt
-rw-r--r-- 1 user user  8293402  4月  1 04:02 abc.csv
-rw-r--r-- 1 user user    49329  3月 27 13:04 def.txt
-rw-r--r-- 1 user user   202421  4月 12 10:29 klmnop.txt
-rw-r--r-- 1 user user   158362  2月 20 16:17 zhogehoge
shell> ls -lS ←大きい順
-rw-r--r-- 1 user user 89792246  3月 21 14:29 XYZ.txt
-rw-r--r-- 1 user user  8293402  4月  1 04:02 abc.csv
-rw-r--r-- 1 user user   158362  2月 20 16:17 zhogehoge
-rw-r--r-- 1 user user   202421  4月 12 10:29 klmnop.txt
-rw-r--r-- 1 user user    49329  3月 27 13:04 def.txt
-T
--full-time

時刻に関する情報を標準の省略形式ではなく完全な形式でリスト表示する。時刻の表示形式は date のデフォルトと同じ。この形式は変更できないが、時刻の文字列を cut で取り出し、結果を ‘date -d’に渡すことができる。

$ ls --full-time sample.txt
-rw-r--r-- 1 user user 44768 2014-05-15 15:47:43.000000000 +0900 sample.txt
$ ls --full-time sample.txt | cut -f 6 -d ' ' ←空白で区切った時の第6要素を取り出す
2014-05-15
$ date -d `ls --full-time sample.txt | cut -f 6 -d ' '` ←dateの既定書式で出力
2014年  5月 15日 木曜日 00:00:00 JST
$ date -d `ls --full-time sample.txt | cut -f 6 -d ' '` "+%Y%m%d" ←西暦4桁月2桁日2桁の書式で出力
20140515
-t
ファイルを新しい順に表示(新しいものが上)。-rオプションを併用(-trオプションを指定)すると逆順で出力(古い順、新しいものが下)。
shell> ls -l ←アルファベット昇順(大文字→小文字)
-rw-r--r-- 1 user user 89792246  3月 21 14:29 XYZ.txt
-rw-r--r-- 1 user user  8293402  4月  1 04:02 abc.csv
-rw-r--r-- 1 user user    49329  3月 27 13:04 def.txt
-rw-r--r-- 1 user user   202421  4月 12 10:29 klmnop.txt
-rw-r--r-- 1 user user   158362  2月 20 16:17 zhogehoge
shell> ls -lt ←新しい順
-rw-r--r-- 1 user user   202421  4月 12 10:29 klmnop.txt
-rw-r--r-- 1 user user  8293402  4月  1 04:02 abc.csv
-rw-r--r-- 1 user user    49329  3月 27 13:04 def.txt
-rw-r--r-- 1 user user 89792246  3月 21 14:29 XYZ.txt
-rw-r--r-- 1 user user   158362  2月 20 16:17 zhogehoge
--time=atime--time=access
--sort=time または -t と一緒に使われると、 -u (atime でソートする) と等しくなる。普通に時刻を表示するオプションと一緒に使われると、各ファイルの最終修正時刻ではなく最終アクセス時刻を表示する。
--time=ctime--time=status--time=use
--sort=time または -t と一緒に使われると、 -c (ctime でソートする) と等しくなる。普通に時刻を表示するオプションと一緒に使われると、各ファイルの最終修正時刻ではなく inode の最終変更時刻を表示する。
-U--sort=none
ディレクトリの中身をソートせず、ディスク上にある順番通りにリスト表示する(-U と -f の違いは、-f オプションが他のオプションを有効にしたり無効にしたりする点にある)。非常に大きなディレクトリをリスト表示する場合、このオプションは特に有用である。なぜなら、ソートしないことにより著しく速くできるからである。
-u
修正時刻ではなく最終アクセス時刻(inode の atime)を表示や並べ替えキーに用いる。
--context
ファイルのコンテキスト情報も出力する。
shell> ls --context
drwxr-xr-x  user user user_u:object_r:user_home_t      .
drwxrwxrwx  user user user_u:object_r:user_home_dir_t  ..
-rw-r--r--  user user user_u:object_r:user_home_t      hoge.html
-rw-rw-r--  user user user_u:object_r:user_home_t      foo.css
-rw-r--r--  user user user_u:object_r:user_home_t      fuga.txt
コンテキスト情報を変更するにはchconコマンドを用いる。

なお、Mac OS X 10.4.11 の bash(2.05b.0(1)-release (powerpc-apple-darwin8.0))では前にハイフンが2つつく長い形式のオプションは使えないらしい。

参考文献・サイト

条件に合ったファイル名一覧(find)

【書式】
find パス... オプション 条件 実行内容
上記書式に記した順(オプション 条件 実行内容)で記載する必要がある。前後しても実行はしてくれるが警告が出る。

オプション

-daystart
-amin、 -atime、 -cmin、 -ctime、 -mmin、 -mtime の時間の基準を 24 時間前 ではなく、コマンドを実行した日の 0 時にする
-depth
ディレクトリ本体の前に、ディレクトリの内容を先に評価する。
-follow
シ ンボリックリンクの参照先を検索する。 -noleaf は自動的に指定されたことになる。
-help
--help
find のコマンドラインの使用方法の概要を表示して終了する。
-maxdepth 階層数
何階層下のサブディレクトリまで対象にするかを指定する。階層数 には負でない整数を指定し、0 を指定すればパスで指定したディレクトリのみを検索しサブディレクトリは検索対象に加えない。
-mindepth 階層数
-mount
-noleaf
-version--version
-xdev
他のファイルシステムにあるディレクトリは探索しない
perm -|+モード値

モード値には文字列若しくは8進数を指定する。

文字列の場合、a starting value of zero is assumed and the mode sets or clears permissions without regard to the process' file mode creation mask.この場合、指定値の先頭にはハイフンを使わないこと。

数値の場合、07777(S_ISUID | S_ISGID | S_ISTXT | S_IRWXU | S_IRWXG | S_IRWXO)のビットだけが比較される。数値の前にハイフン(-)を記すと、最低限指定値ビットが全てONになっている、つまりファイル権限値が指定値以上であれば真になる。数値の前にプラス(+)を記すと、指定値ビットのいずれかがONになっている、つまりファイル権限値が指定値以下であれば真になる。

条件

-amin 数値
-atimeの「分」版。 最終アクセス時刻とfindコマンドを起動した時刻との差が指定値であるファイルを処理対象とする。 数値は分(分単位に切り上げ)で指定したものとみなされる。数値のみなら「丁度」、"+"をつければ「より大」、"-"をつければ「より小」の意味となる。
-aminの引数例 時刻差範囲
10 10:00<= 時刻 < 11:00(分単位に切り上げて10分)
-30 00:00<= 時刻 < 30:00(分単位に切り上げて30分未満)
+120 2:00:00< 時刻(分単位に切り上げて120分=2時間より大)
-anewer ファイル名
-neweramと同じ。指定ファイルの最終内容修正時刻よりも新しい最終アクセス時刻を持つファイルが対象となる。
-atime 引数
最終アクセス時刻とfindコマンドを起動した時刻との差が指定値または指定範囲にあるファイルを処理対象とする。 数値のみで指定した場合、24時間単位で切り上げた「日」を指定したものとみなされる。 引数に指定できる単位は以下の通り。
  • s→秒
  • m→分(60秒)
  • h→時間(60分)
  • d→日(24時間)
  • w→週(7日)
単位は組み合わせて"1h30m"などとすることも可能。 値の先頭に何もつけなければ指定値に一致するもの、"+"をつければ「より大」、"-"をつければ「より小」の意味になる。
-atimeの引数例 時刻範囲
1 0:00:00< 時刻 <= 24:00:00(日単位に切り上げて1日)
3 48:00:00< 時刻 <= 72:00:00(日単位に切り上げて3日)
-3 0:00:00<= 時刻 <= 48:00:00(日単位に切り上げて3日未満)
+3 72:00:00< 時刻(日単位に切り上げて3日より大)
-6h 0:00:00<= 時刻 < 6:00:00(6時間未満)
-cmin n
-aminとほぼ同等だが、-aminは最終アクセス時刻と比較するのに対し、こちらは最終のファイルステータス修正時刻と比較する。
-cnewer ファイル名
-newercmと同じ。指定ファイルの最終内容修正時刻よりも新しい最終ステータス修正時刻を持つファイルが対象となる。
-ctime 引数
-atimeとほぼ同等だが、-atimeは最終アクセス時刻と比較するのに対し、こちらは最終のファイルステータス修正時刻と比較する。
-empty
-false
-fstype ファイルシステムの型
-gid n
-group グループ名
-ilname ファイル名パターン
-iname ファイル名パターン
-inum n
-ipath パスのパターン
-iregex ファイル名パターン
-links n
-lname ファイル名パターン
-mmin n
-aminとほぼ同等だが、-aminは最終アクセス時刻と比較するのに対し、こちらは最終のファイル修正時刻と比較する。
-mnewer ファイル名
-newer-newermmと同じ。
-mtime n
-atimeとほぼ同等だが、-atimeは最終アクセス時刻と比較するのに対し、こちらは最終のファイル修正時刻と比較する。
-newer ファイル名
対象ファイルの修正日付がファイル名で指定したファイルよりも新しい場合は処理対象となる。
-newerXY ファイル名
現在のファイルの最終アクセス時刻 (X=a)、ステータス修正時刻 (X=c)、内容修正時刻 (X=m) が、 file の最終アクセス時刻 (Y=a) 、ステータス修正時刻 (Y=c) ・内容修正時刻 (Y=m) より新しい場合は、真となります。さらに Y=t の場合、 file は代わりに、 cvs(1) が理解する直接的な時刻指定として解釈されます。 ‐newermm は ‐newer と同じ意味になります。
-name ファイル名パターン

対象ファイルのパス名の最後のファイル名部分が ファイル名パターン で指定したものとマッチするかどうかを調べ、マッチした場合は処理対象になる。 ファイル名パターン としては、シェルで使われるパターンマッチ指定 ("["(?)、"*"(任意の0文字以上)、"?"(任意の1文字)) が使用可能。これらの文字はバックスラッュ ("\") を前におけば、パターンマッチ指定ではなく通常の文字として扱われる。

find / \! -name "*.c" -p

なお、これらパターンマッチ指定を含む場合、文字列全体を引用符で囲んでおく必要がある[6]

-nouser
-nogroup
-path パスのパターン
-perm 許可属性
-perm -許可属性
-perm +許可属性
-regex パターン
ファイル名だけではなく、ファイルのパス全体が、正規表現パターンにマッチする場合、処理対象となる。
例:ファイル名「./foo/xyzzy」
<マッチするパターン>
.*/[xyz]*
.*/foo/.*
<マッチしないパターン>※パスの一部にしかマッチしていない
xyzzy
/foo/

例:
$ 
-size 数値接尾辞
ファイルが占める領域が数値であれば真。接尾辞指定を省略した場合または b を指定した場合数値の単位はブロック(=512バイト)、c を指定した場合はバイト、k を指定した場合はキロバイト、w を指定した場合はワード(=2バイト)。サイズには間接ブロック(indirect block)は含まれないが、穴あきファイル(sparse file)における実際には割り当てられていないブロックについては含まれる。
-true
-type タイプ
タイプで指定された型のファイルなら真。タイプに指定できる値と意味は以下の通り。
  • b ブロックスペシャルファイル(バッファ付き)
  • c ブロックスペシャルファイル(バッファ無し)
  • d ディレクトリ
  • p 名前付きパイプ(FIFO)
  • f 通常のファイル
  • l シンボリックリンク
  • s ソケット
-uid n
-used n
-user ユーザ名
-xtype c

実行内容

-delete
ファイルを削除する。→このオプションは現在はない? 代替の方法として「xargs rm」にパイプする方法がある3
例:
$ ls -l *.log
-rw-r--r-- 1 user user 70508  9月  1日 12:00 2018 201808.log
-rw-r--r-- 1 user user 80413  8月  1日 12:00 2018 201807.log
-rw-r--r-- 1 user user 89096  7月  1日 12:00 2018 201806.log
-rw-r--r-- 1 user user 61858  6月  1日 12:00 2018 201805.log
$ find *.log -mtime +60
201806.log
201805.log
$ find *.log -mtime +60 | xargs rm
$ ls -l *.log
-rw-r--r-- 1 user user 70508  9月  1日 12:00 2018 201808.log
-rw-r--r-- 1 user user 80413  8月  1日 12:00 2018 201807.log
-exec コマンド
コマンドを実行する。-execより後に記された引数は「;」も含めて-execの引数として指定されたコマンドおよびその引数とみなされる。但し、「;」はシェルによって展開されないようバックスラッシュ(\)を直前に置いてエスケープする必要がある。更にこのバックスラッシュの直前には空白が必要[3]。文字列「{}」はヒットした各ファイル名に置換される。
例:./*.log で最終更新日が7日以上古いファイルファイルを移動する(サブディレクトリにあるファイルは対象としない)
$ find ./*.log -maxdepth 0 -mtime +7 -type f -exec mv {} ./old \;
-fls 出力先ファイル名
-fprint 出力先ファイル名
-fprint0 出力先ファイル名
-fprintf 出力先ファイル名 出力書式
-ok コマンド
-print
-exec-ls-print0-okのオプションがいずれも指定されていない場合、結果を標準出力(特に指定がなければ画面)へ結果を出力する。各結果(ファイルパス)の最後には改行が出力される。特にこの指定を行わなくても、指定があったものとして動作する。
-print0
-printとほぼ同等だが、各結果の後に出力される文字は改行ではなくヌル文字(文字コード0)となる。
-printf 出力書式
-prune
-ls

出力書式

\
エスケープ文字
%
書式指定文字

演算子

( 条件 )
!-false-not
続く条件を否定する。
【例】ファイル名の末尾が".bak"ではないファイル全てを表示。
find ! -name "*.bak" -print
%
書式指定文字
【例】カレントディレクトリ以下にある、1日以内に更新されたファイルのファイル名を出力する。
find . -mtime -1 -print
※以下の通り、実行内容 -print の指定がなくても同じ(既定の動作が標準出力への出力であるため)
find . -mtime -1

【例】/var/www/以下で、更新日付が15日以内のファイルをbzip形式で圧縮する(→圧縮についてはtar参照)。
tar -jxvf var_www.tar.bz2 `find /var/www/* -mtime -15`

【例】最終アクセス時刻が7日以上前のファイルを削除する
rm `find -atime +7`
または
find -atime +7 -delete

【例】下記条件を全て満たすファイル名、該当行、行番号を表示する(→grepも参照のこと)
* ファイル中に「hoge」を含む
* ファイル名が「.pl」で終わる
* カレントディレクトリ配下全てが対象
* パス・ファイル名中に「bkup」を含むファイルは除外する
$ grep -n PDB `find . -name "*.pl" -print` | grep -v bkup
./foo01.pl:38:    $PDB_DATA =  $hoge_root . "/PDB";
./boo01.pl:27:my $PDB_DATA =  $DATA_HOME . "/PDB";
./poo01.pl:80:    $PDB_DATA =  $DATA_HOME . "/PDB";
    

参考文献・サイト

ファイル一覧出力をタイムスタンプでフィルタリング(find

やりたいこと:ファイル一覧をファイルのタイムスタンプでフィルタリングし、 しかも詳細形式( ls -l 相当)で出力する。

書式:
find [filename] -mtime [+/-][day] -ls

例:
find * -mtime -7 -ls
カレントディレクトリにある全てのファイルの中で、 最終更新日が7日以内のものを、 詳細形式で出力する。

find
ファイルを検索するコマンド
filename
ファイル名。パス指定やワイルドカードの指定が可能。
-mtime +/- day
最終更新日がday日以内(−)/以降(+)のもののみを対象とする。
-ls
詳細形式で表示する。

参考サイト:
UNIXコマンド [find]

指定日付以前のファイルを表示/削除

カレントディレクトリ(.)にある、10日以上古いファイルを削除する。
修正日が10日以上古い(-mtime +10)、ファイルをみつけ、 それを表示(-ls)/それを削除(-exec rm {} \;)。
findコマンドの出力するファイル名リストが{}に代入されて、次のコマンド(rm)に渡されて処理される。最後は\; で締めるらしい。

find . -mtime +10 -ls
find . -mtime +10 -exec rm {} \;

参考サイト:findの使い方

ファイルの圧縮解凍

gz(gzip)

gzipコマンドは、オプションなしで実行した場合、指定したファイルをgzip形式で圧縮し、元のファイルは消去して「元のファイル名+『.gz』」のファイルが作成される。 複数ファイルを指定するときはスペースで区切る。ワイルドカードの使用もできる。省略すると標準入力からの入力となる。

【書式】
gzip オプション ファイル名

オプション

-d--decompress--uncompress
指定したファイルを解凍する。指定ファイルの拡張子が「.gz」などでないと「unknown suffix -- ignored」というエラーとなる。
-f--force
圧縮・解凍後のファイル名と同名のファイルが既に存在した場合でも確認せず上書きする。非バックグラウンドでこのオプションを指定せず実行する場合、上書きするかどうかの指示を求められる。
【例1】hoge.txt を圧縮する(圧縮後ファイルのファイル名は hoge.txt.gz となり、hoge.txt 削除される)
gzip hoge.txt

【例2】現在のディレクトリにある、拡張子が .txt であるファイルを全て圧縮する。
gzip *.txt

【例3】ファイル archive.gz を解凍する。
gzip *.txt

【例4】拡張子が.gzであれば(ファイルの末尾から.gzを除去すると値が変わるのであれば)解凍を行う
if [ "`basename $FILE`" != "`basename $FILE '.gz'`" ];then
  gzip $FILE
fi
参照:iftestbasename

参考文献・サイト

zip/unzip

ZIP形式でファイルを圧縮するにはzip、解凍や書庫に内包されるファイルのファイル名一覧の表示を行うにはunzipを用いる。

【書式】圧縮
zip  オプション 書庫ファイル名 書庫に入れるファイルの名前
書庫に入れるファイルの名前
空白区切りで複数指定可能。
解凍対象ファイル
ZIP書庫ファイル・パスを指定する。ファイル名部分には以下のワイルドカード使用可能。ファイル名(パターン)は空白で区切って複数記述可能。
記号 内容
* 0文字以上の任意の文字(列)
? 任意の1文字
[...] 括弧内に記した文字のいずれか1文字。ハイフンによる範囲指定(例:[a-h]、a〜hのいずれか1文字)や、感嘆符(!)またはキャレット記号(^)によるパターンの反転指定(例:[!0-6]、[^0-6]、0〜6の数字以外)も可能。左括弧を指定するには [[] と指定する。パターンに一致するファイルがなければ、パターン文字通りのファイル名が検索され、それもなければ拡張子 .zip を付加したファイルが検索される。自己解凍ZIP書庫についても対応している。明示的に自己解凍書庫を指定するなら .exe 拡張子を付けて指定する。
-d 解凍先ディレクトリ
解凍先ディレクトリを指定する。指定がない場合の既定値はカレントディレクトリ。任意のディレクトリを指定できるが、実際解凍を実行するには指定したディレクトリに書き込み権限が必要。"-d" と ディレクトリ指定値の間に空白を入れても入れなくても動作するが、UNIXの "~" の場合、空白を空けるとユーザホームディレクトリを意味するが、間を空けないと文字通り"~"として受け取られ、カレントディレクトリにある"~"というサブディレクトリを指定したことになる。
-e
--encrypt
圧縮時、パスワードを設定する。このオプションを指定すると、パスワードを入力するプロンプトが表示され、そこで設定したいパスワードを入力する。入力値は表示されない。標準エラー出力がtty(ディスプレイ)でなかった場合、zipコマンドは終了する。パスワードの入力は2回要求され、両者に同じ値を入力しないとエラーとなり終了する。
-j
パス部分を保持せず、ファイル名だけを保持する。このオプションを指定しない場合、カレントディレクトリからの相対パス付きでファイル名が保持される。
$ zip awstats.zip /usr/local/awstats/data/awstats0?2014.hoge.org.txt
  adding: usr/local/awstats/data/awstats012014.hoge.org.txt (deflated 68%)
  adding: usr/local/awstats/data/awstats022014.hoge.org.txt (deflated 69%)
  adding: usr/local/awstats/data/awstats032014.hoge.org.txt (deflated 67%)
  adding: usr/local/awstats/data/awstats042014.hoge.org.txt (deflated 66%)
  adding: usr/local/awstats/data/awstats052014.hoge.org.txt (deflated 68%)
  adding: usr/local/awstats/data/awstats062014.hoge.org.txt (deflated 68%)
  adding: usr/local/awstats/data/awstats072014.hoge.org.txt (deflated 66%)
  adding: usr/local/awstats/data/awstats082014.hoge.org.txt (deflated 68%)
  adding: usr/local/awstats/data/awstats092014.hoge.org.txt (deflated 65%)
$ unzip -l awstats.zip 
Archive:  awstats.zip
  Length     Date   Time    Name
 --------    ----   ----    ----
   186689  02-01-14 23:34   usr/local/awstats/data/awstats012014.hoge.org.txt
   187477  03-01-14 23:35   usr/local/awstats/data/awstats022014.hoge.org.txt
   124371  04-01-14 23:35   usr/local/awstats/data/awstats032014.hoge.org.txt
   115929  05-01-14 23:21   usr/local/awstats/data/awstats042014.hoge.org.txt
   135132  06-01-14 23:22   usr/local/awstats/data/awstats052014.hoge.org.txt
   124932  07-01-14 23:36   usr/local/awstats/data/awstats062014.hoge.org.txt
   124611  08-01-14 23:36   usr/local/awstats/data/awstats072014.hoge.org.txt
   136844  09-09-14 19:50   usr/local/awstats/data/awstats082014.hoge.org.txt
    65119  09-10-14 23:38   usr/local/awstats/data/awstats092014.hoge.org.txt
 --------                   -------
  1201104                   9 files
$ zip awstats_nopath.zip -j /usr/local/awstats/data/awstats0?2014.hoge.org.txt
  adding: awstats012014.hoge.org.txt (deflated 68%)
  adding: awstats022014.hoge.org.txt (deflated 69%)
  adding: awstats032014.hoge.org.txt (deflated 67%)
  adding: awstats042014.hoge.org.txt (deflated 66%)
  adding: awstats052014.hoge.org.txt (deflated 68%)
  adding: awstats062014.hoge.org.txt (deflated 68%)
  adding: awstats072014.hoge.org.txt (deflated 66%)
  adding: awstats082014.hoge.org.txt (deflated 68%)
  adding: awstats092014.hoge.org.txt (deflated 65%)
$ unzip -l awstats_nopath.zip
Archive:  awstats_nopath.zip
  Length     Date   Time    Name
 --------    ----   ----    ----
   186689  02-01-14 23:34   awstats012014.hoge.org.txt
   187477  03-01-14 23:35   awstats022014.hoge.org.txt
   124371  04-01-14 23:35   awstats032014.hoge.org.txt
   115929  05-01-14 23:21   awstats042014.hoge.org.txt
   135132  06-01-14 23:22   awstats052014.hoge.org.txt
   124932  07-01-14 23:36   awstats062014.hoge.org.txt
   124611  08-01-14 23:36   awstats072014.hoge.org.txt
   136844  09-09-14 19:50   awstats082014.hoge.org.txt
    65119  09-10-14 23:38   awstats092014.hoge.org.txt
 --------                   -------
  1201104                   9 files
-l
書庫に含まれるファイルの一覧を表示する。
-x 除外ファイル
解凍処理対象から除外するファイル名・パターンを指定する。ワイルドカードはディレクトリ名の分離記号(スラッシュ、/)も含んでしまうため、このオプションを使ってカレントディレクトリにあるファイルだけを対象とすることなどができる(例:unzip *.[ch] -x */*、カレントディレクトリにあるCソースファイルだけを解凍する)。
【書式】解凍
unzip オプション 解凍対象ファイル名 -x 除外ファイル -d 解凍先ディレクトリ
【書式】書庫に含まれるファイル名一覧を表示
unzip -l 対象zip書庫ファイル名
    

Linuxでzip圧縮し、Windowsで解凍すると書庫内ファイルのファイル名のうちマルチバイト部分が文字化けしている(Ubuntu 10.04→Windows 7等で確認)。 対策方法は以下の通り(参考:Linux 上で Windows 向けの zip ファイルを作る - ~fumi/ChangeLog

$ ls
ふが.jpg  ぷー.jpg  ほげ.jpg
$ convmv --notest -f utf8 -t cp932 *
Your Perl version has fleas #37757 #49830 
mv "./ふが.jpg"	"./�ӂ�.jpg"
mv "./ぷー.jpg"	"./�Ձ[.jpg"
mv "./ほげ.jpg"	"./�ق�.jpg"
Ready!
$ ls
?ق?.jpg  ?ӂ?.jpg  ?Ձ[.jpg
$ zip ../text.zip ./*
  adding: �ӂ�.jpg (deflated 0%)
  adding: �ق�.jpg (deflated 0%)
  adding: �Ձ[.jpg (deflated 0%)
# これをWindows側で見ると文字化けせず見える
1. ファイル名のエンコーディング方式を変更する
convmv コマンドを用いる。

tar

書庫の操作を行う。

tar 機能指定文字 オプション ファイル名/ディレクトリ名 対象ディレクトリ
    

最初の引数では機能を指定する(必須、-Acdrtuxのいずれか1つ)。1文字表記(ハイフン1個+1文字)の場合、他のオプションと合わせ続けて指定できる(例:-zxvf)。

ファイル名にパスを含めて指定すると、書庫内でも階層化されてファイルが格納される。但し、既定の動作では最上位(システムルート)を示すスラッシュは除去される。

【例】
(1)gzip形式で圧縮された書庫ファイル file1.tar.gz 中の全ファイルを解凍・展開する。
shell> tar -zxvf file1.tar.gz
※2つ目以降の引数にファイル名を指定すれば指定ファイルのみが取り出される

(2)bzip2形式で圧縮された書庫ファイル file1.tar.bz2 を解凍・展開する。
7z形式(7za)に対応するオプションはないようなので、パイプでつないで処理する。
shell> 7za x so foo.tar.7z | tar -xf -

shell> tar -jxvf file1.tar.bz2
(3)hoge ディレクトリ以下をgzip形式で圧縮した書庫ファイル hoge.tar.gz を作成
shell> tar -zcvf hoge.tar.gz hoge
(4)書庫ファイル hoge.tar.gz 内のファイル名一覧表示
shell> tar -tzf hoge.tar.gz
(5)書庫ファイル hoge.tar にファイル foo.txt を追加
shell> tar -rf hoge.tar foo.txt
※圧縮された書庫への追記は失敗するよう。書庫が圧縮されている場合、
「gzip -d 圧縮書庫ファイル名」などであらかじめ解凍しておく
(6)/var/www/html/index.php を backup.tar に追加
[user@server ~]$ tar -cvf backup.tar /var/www/data ※/var/www/data 以下を格納した書庫を backup.tar に作成
shell> tar -r -C /var/www/html -f backup.tar index.php
※/var/www/html/index.php を書庫 backup.tar に追加
    

機能指定文字

-A
--catenate
--concatenate
アーカイブに別のtarアーカイブの内容を追加する
-c
--create
新規にアーカイブを作成し指定ファイルを書き込み
【例】
$ tar -cvf test.tar hoge*
hoge.txt
hoge.jpg
hoge.png
-d
--diff
--compare
アーカイブ内のファイルとの違いを調査
--delete
アーカイブ内の指定ファイルを削除
-M
--multi-volume
複数に分割した書庫の作成、読み取り、解凍を行う。
-r
--append
アーカイブの末尾にファイルを追加
【例】hoge.txtというファイルをfoo.tarというアーカイブに追加する
tar -rf hoge.txt foo.tar
なおgzipなどの圧縮がかかった書庫に対してファイルの追加はできない。
$ tar -rzf hoge.txt foo.tar.gz
ar: 圧縮されたアーカイブはアップデートできません
より詳しい情報は `tar --help' または `tar --usage' で.
-t
--list
アーカイブ内容リストの表示
-u
--update
指定ファイル中、アーカイブ内のファイルよりも新しいもののみ追加
-v
--verbose
圧縮・解凍対象ファイルを列挙する。
-x
--extract
--get
アーカイブからファイルを抽出
--strip-components=階層数
展開する際、階層数に指定した階層だけ上位ディレクトリを除外して展開する。
【例】
$ tar -zxvf mediawiki-1.20.6.tar.gz -C /var/www/html/wiki/
mediawiki-1.20.6/
mediawiki-1.20.6/profileinfo.php
...
mediawiki-1.20.6/images/.htaccess
mediawiki-1.20.6/images/README
$ ls /var/www/html/wiki
AdminSettings.php      UPGRADE         index.php5            redirect.phtml
AdminSettings.sample   api.php         install-utils.inc     resources
COPYING                api.php5        languages             serialized
CREDITS                bin             load.php              skins
FAQ                    cache           load.php5             t
HISTORY                composer.json   maintenance           tests
INSTALL                config          math                  thumb.php
LocalSettings.php      docs            mediawiki-1.20.6      thumb.php5
Makefile               extensions      mw-config             thumb_handler.php
README                 images          opensearch_desc.php   thumb_handler.php5
RELEASE-NOTES          img_auth.php    opensearch_desc.php5  trackback.php
RELEASE-NOTES-1.19     img_auth.php5   php5.php5             trackback.php5
RELEASE-NOTES-1.20     includes        profileinfo.php       wiki.phtml
StartProfiler.php.bak  index-test.php  redirect.php
StartProfiler.sample   index.php       redirect.php5
# ディレクトリ「mediawiki-1.20.6」が指定場所(/var/www/html/wiki)にできている
$ rm -rf /var/www/html/wiki/mediawiki-1.20.6
$ tar -zxvf mediawiki-1.20.6.tar.gz -C /var/www/html/wiki/ --strip-components=1
$ ls /var/www/html/wiki
AdminSettings.php      UPGRADE         index.php5            resources
AdminSettings.sample   api.php         install-utils.inc     serialized
COPYING                api.php5        languages             skins
CREDITS                bin             load.php              t
FAQ                    cache           load.php5             tests
HISTORY                composer.json   maintenance           thumb.php
INSTALL                config          math                  thumb.php5
LocalSettings.php      docs            mw-config             thumb_handler.php
Makefile               extensions      opensearch_desc.php   thumb_handler.php5
README                 images          opensearch_desc.php5  trackback.php
RELEASE-NOTES          img_auth.php    php5.php5             trackback.php5
RELEASE-NOTES-1.19     img_auth.php5   profileinfo.php       wiki.phtml
RELEASE-NOTES-1.20     includes        redirect.php
StartProfiler.php.bak  index-test.php  redirect.php5
StartProfiler.sample   index.php       redirect.phtml
# 今度はディレクトリ「mediawiki-1.20.6」はできずその配下の各ファイルディレクトリが指定場所(/var/www/html/wiki)に展開される
	

オプション

--help
tarコマンドのオプション一覧と解説を表示して終了する。このオプションを指定すると他のオプションは無視される。
-C ディレクトリ--directory ディレクトリ
残りの引数を処理する前にディレクトリへ移動する。書庫を解凍する場所を指定する場合などに使用できる。
-f ホスト名: ファイルパス・名
指定ファイルの読み書き
-j
--bzip2
bzip2でフィルタリング(書庫への格納の際圧縮し、書庫から抽出する際は解凍する)
【例1】hogeディレクトリ配下の各ファイルを hoge.tar.bz2 に圧縮(bzip2圧縮書庫)
tar -jxv hoge.tar.bz2 hoge
【例2】例1のファイル一覧出力付き
tar -jxvf hoge.tar.bz2 hoge
【例3】bzip2圧縮書庫ファイル hoge.tar.bz2 内ファイルリスト表示
tar -jtf hoge.tar.bz2
【例4】bzip2圧縮書庫ファイル hoge.tar.bz2 を解凍(ファイル一覧出力付き)
tar -jxvf hoge.tar.bz2
-J
--xz
xzでフィルタリング(書庫への格納の際圧縮し、書庫から抽出する際は解凍する)
【例1】hogeディレクトリ配下の各ファイルを hoge.tar.xz に圧縮(xz圧縮書庫)
tar -Jxv hoge.tar.xz hoge
【例2】例1のファイル一覧出力付き
tar -Jxvf hoge.tar.xz hoge
【例3】xz圧縮書庫ファイル hoge.tar.xz 内ファイルリスト表示
tar -Jtf hoge.tar.xz
【例4】xz圧縮書庫ファイル hoge.tar.xz を解凍(ファイル一覧出力付き)
tar -Jxvf hoge.tar.xz
--exclude ファイルパターン
ファイルパターンにマッチするファイルを対象から外す。
-X ファイル名
--exclude-from ファイル名
ファイル名に列挙したファイルを対象から外す。
-z--gzip(圧縮)、--gunzip(解凍)
gzipでフィルタリング(書庫への格納の際圧縮し、書庫から抽出する際は解凍する)
【例1】hogeディレクトリ配下の各ファイルを hoge.tar.gz に圧縮(gzip圧縮書庫)
tar -zxv hoge.tar.bz2 hoge
【例2】例1のファイル一覧出力付き
tar -zxvf hoge.tar.gz hoge
【例3】gzip圧縮書庫ファイル hoge.tar.gz 内ファイルリスト表示
tar -ztf hoge.tar.bz2
【例4】gzip圧縮書庫ファイル hoge.tar.gz を解凍(ファイル一覧出力付き)
tar -zxvf hoge.tar.gz
-Z--compress(圧縮)、--uncompress(解凍)
compressでフィルタリング(書庫への格納の際圧縮し、書庫から抽出する際は解凍する)
-v
処理ファイル一覧を表示

参考文献・サイト:

bz2(bzip2)

書式:

bzip2 [-cdfkqstvzVL123456789] [ファイル名 ...]
    

オプション

  • -c --stdout: 圧縮・解凍した結果を標準出力に出力する。
  • -d --decompress: ファイルを解凍する。
  • -z --compress: -d の反対で、ファイルを圧縮する。
  • -t --test: ファイルの解凍チェックを行う(実際に解凍はしない)。
  • -f --force: 出力ファイルと同名のファイルがあった場合上書きする。
  • -k --keep: 解凍・展開後も入力ファイルを保持する(削除しない)。
  • -q --quiet: 致命的エラー以外は出力しない。
  • -v --verbose: 詳細(圧縮率)を表示する。
  • -L --license -V --version: ソフトウェアのバージョン、ライセンス、配布条件を表示する。
  • --: これ以降の引数が例えダッシュで始まるものであってもファイル名として扱う(ダッシュで始まる名前のファイルを扱う際に使用)。

例1:test.tar.bz2を解凍・展開する。

bzip2 -dc test.tar.bz2 | tar xvf -
    

この形式に対応したtarコマンドが使える場合はbzip2を使う必要はない。

7-zip(7za)

7-zipはオープンソースのファイル圧縮解凍アプリケーション。元々Windows用として開発されていたが、現在では他のプラットフォーム用にも移植されUNIX系OSでも使用可能[7][8]

CentOS/RHEL系の場合yumでp7zipをインストールすれば使用可能。コマンド名は"7za"。

# yum install yum list p7zip
# 7za x jogamp-all-platforms.7z # x でディレクトリ付き解凍

7-Zip (A) [64] 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18
p7zip Version 9.20 (locale=ja_JP.UTF-8,Utf16=on,HugeFiles=on,8 CPUs)

Processing archive: jogamp-all-platforms.7z

Extracting  jogamp-all-platforms/gluegen-java-src.zip
(中略)
Extracting  jogamp-all-platforms

Everything is Ok

Folders: 17
Files: 290
Size:       67995588
Compressed: 16490275
# 

コマンドの書式は以下の通り。

【書式】
7za 機能指定 -  スイッチ アーカイブ名 引数

機能指定

a
追加(Add)
d
削除(Delete)
e
抽出(Extract)
l
内容一覧表示(List)
t
テスト(Test)
u
更新(Update)
x
フルパスを指定して抽出(eXtract with full paths)

スイッチ

-ai @対象ファイルリスト記述ファイル
-ai !ファイルパターン
アーカイブに含めるファイルを指定する。指定は対象ファイルリストを記述したテキストファイル、またはファイルパターンで行う。ファイルパターンにはワイルドカードが使用可能。
-ax @対象ファイルリスト記述ファイル
-ax !ファイルパターン
アーカイブに含めないファイルを指定する。指定は対象ファイルリストを記述したテキストファイル、またはファイルパターンで行う。ファイルパターンにはワイルドカードが使用可能。
-bd
進行状況(パーセントインジケーター)を表示しない。
-so
データを標準出力に書き出す。tarなどに渡して解凍する場合などに使える。
【例】
7za x -so foo.tar.7z | tar -xf -
-si
データを標準入力から受け取る。tarコマンドが出力した書庫データを圧縮する時などに使える。
【例】
tar -cf - targetdir | 7za a -si foo.tar.7z

Z(compress/uncompress)

.Z拡張子を持つ圧縮ファイルの作成、解凍はそれぞれcompressuncompressのコマンドで行う。圧縮の際、各ファイルの名前は変更され、拡張子.Zが付加される。解凍の際は逆に拡張子.Zが除去される。[9]

【書式】
compress -fv -b ビット ファイル名...
compress -c -b ビット ファイル名
uncompress -fv ファイル名...
uncompress -c ファイル名
-b ビット
コードサイズを指定したビット数に制限する。指定可能な値は9以上16以下の整数で、指定がない場合の既定値は16。
-c
圧縮または解凍したものを標準出力に出力する。いずれのファイルも変更しない。-vオプションは無視される。例え圧縮後のデータが元のファイルより大きくなっても圧縮を試みる。
-f
ファイルが既に存在した場合でも確認することなく上書きする。圧縮後のデータが元のファイルより小さくならない場合でも圧縮は行われる。
-v
各ファイルのサイズがどれだけ減ったかをパーセントで表示する。解凍する場合(uncompressの場合)、あるいは-cオプションが指定された場合、このオプションを指定しても無視される。

圧縮にはレンペル・ジヴ(Lempel-Ziv)アルゴリズムを修正したものが用いられている。まず、ファイル中にある共通の部分文字列を...

xz

7-Zip で使われているアルゴリズム LZMA が gzip 相当の圧縮ツール xz として実装されたもの[10]

リンクファイルの作成(ln

ハードリンクは同一ファイルの別名で、シンボリックリンクはWindowsで言うショートカット、Macで言うエイリアスのようなものらしい。シンボリックリンクを作るコマンドは以下の通り。

ln -s oldfile newfile

オプション一覧は以下の通り。

ln (option) file/directory name linkfile/linkdirectory name

-f: 確認なし上書き
-v: 処理内容出力
-s: シンボリックリンク作成(この指定がないとハードリンク)
注意:
  1. oldfile はカレントディレクトリからのパスではなく、newfileからのパスを記述すること(リンクファイル作成後、ls -l コマンドでリンク内容を確認すること。
  2. ファイル指定にはワイルドカードや正規表現は使えないみたい?
参考サイト:

複数ファイルのシンボリックを作成する方法

ls コマンドで出力したファイル名一覧をパイプでperlに渡して処理。

【例】カレントディレクトリのmom???_??.jpg ファイルに対するシンボリックリンクファイルを、
   ファイル名のmomをpdbに変更して作成(?は数字)
ls -1 mom???_??.jpg | perl -n -e 'if(s/^(mom)([0-9]{3}_[0-9]{2}¥.jpg)/ln -s $1$2 pdb$2/){system($_)};'
    

バッククォート(`)を使ってコマンドを入れ子にしてもできる(但し、この方法だと、元ファイルと同一ファイル名のリンクファイルしか作成できない)。

【例】../../../resource/mom/imagesにあるjpegファイル全てのシンボリックリンクをカレントディレクトリに作成。
ln -s `ls ../../../resources/mom/images/*.jpg` ./
    

ファイルのコピー(cp

ファイルやディレクトリをコピーする。

書式1:1個のファイルを、コピー先のファイル名を指定して、コピーする。

cp オプション コピー元ファイル名 コピー先ファイル名
  

2つ目の引数として指定するコピー先ファイル名は、ディレクトリとして存在しないこと。ディレクトリとして存在する名前を指定した場合、次の書式2であると見なされる。 ファイル名やディレクトリ名に空白が含まれる場合はファイル名の前後をダブルクォート(")またはシングルクォート(')で囲む必要がある。そうしないと2つの引数であると見なされてしまう。これは書式2でも同じ。

【例1】ファイル hoge.txt をファイル hoge2.txt にコピーする。
cp hoge.txt hoge2.txt
  

書式2:1個以上のファイルを、コピー先ディレクトリを指定してコピーする。

cp オプション コピー元ファイル名... コピー先ディレクトリ
  

コピー元ファイル名...には複数のファイルを列挙できる。ファイル名は空白で区切る。書式2の場合、最後の引数がコピー先ディレクトリとなる。こちらの書式の場合、ファイル名はそのままでコピーされる。

【例2】ファイル hoge.txt をファイル hoge2.txt にコピー。
shell> ls -F ディレクトリ名の後に "/" をつけてカレントディレクトリのファイル・ディレクトリ名一覧を表示。
bak/  hoge.txt  hoge2.txt
shell> ls -F bak
shell> (bakフォルダ内にはまだファイルは1つもない)

【例3】ファイル hoge.txt と hoge2.txt を bak フォルダにコピー。
shell> cp hoge.txt hoge2.txt bak
shell> ls -F
bak/  hoge.txt  hoge2.txt
shell> ls -F bak
hoge.txt  hoge2.txt

【例4】ファイル hoge.txt をファイル hoge hoge.txt にコピー
   (コピー先ファイル名に空白が含まれる)。
shell> cp hoge.txt "hoge hoge.txt"
shell> ls -F
bak/  hoge.txt  hoge2.txt  hoge hoge.txt
  

オプションは以下の通り。

-a--archive
コピー先で、できる限り元のファイルの構成と属性を保持する (ディレクトリ構造体は保存しない)。-dpR と同じ。
-d
リンクの元をたどらない。 シンボリックリンクをコピーする場合、シンボリックリンクが指しているファイルをコピーするのではなく、シンボリックリンクとしてコピーする。 ハードリンクをコピーする場合、コピー先でもハードリンクとして保持される。
-p
コピー元のファイル属性(所有者、グループ、アクセス権(setuid、setgidビットも含む)、最終修正時刻、最終アクセス時刻)を保持する。所有者やグループを保持するのに失敗した場合はsetuidビットとsetgidビットはクリアされる。この場合、最終アクセス時刻がコピー元とコピー先で異なることになる。
-r
サブディレクトリもコピーする。ディレクトリでもシンボリックリンクでもなければファイルとしてコピーする。
-R--recursive
サブディレクトリもコピーする。ディレクトリ以外のものはその状態を保持する(-rはシンボリックリンク以外は全てファイルとして見なす)。
-v--verbose
コピー元、コピー先のファイル名を表示する。
【例5】カレントディレクトリの全ファイルを、確認なしでファイル名を表示しながら、属性そのままでコピー。
cp -fpv * ../dir2
  

参考サイト、文献:

ファイル・ディレクトリの削除(rm

rm

rm -rf directory
-r:ディレクトリごと削除する
-f:警告せずに動作を実行する
参考:UNIXコマンド [rm]

誤ってファイルを削除した時の復元方法(extundelete)

誤ってrmコマンドなどでファイルを削除してしまった時、extundelete[8]をインストールし同名のコマンドを実行することにより復元できる...かも知れない[7]

ハイフンで始まるファイル名の指定

[10]

ファイルの移動、ファイル名変更(mv)

書式1:

mv [-f | -i | -n] [-v] 移動元ファイル 移動先ファイル
  

移動先ファイルがディレクトリ名として存在しない名前である場合、移動先ファイルパスと名前と見なされる。既存のディレクトリ名と一致した場合は移動先ディレクトリを指定した書式2であると見なされる。

書式2:

mv [-f | -i | -n] [-v] 移動元ファイル ディレクトリ
  

この場合、ファイル名はそのままで、ファイルの場所を指定したディレクトリへと移動する。

オプション:

移動元、移動先のいずれかの実体がローカルにない場合、すなわちNFSマウントされた領域であった場合うまくいかない場合あり。この場合は cp コマンドでファイルをコピーしてから移動元を削除するといいらしい[2]

参考文献・サイト

カレントディレクトリを表示(pwd)

pwdはカレントディレクトリを絶対パスで表示する。

$ pwd
/home/user

bashの場合、pwdコマンドは以下の2種類がある[28]

  1. bash組み込みの内部コマンド
  2. 外部コマンド(/bin/pwd)

シンボリックリンクをたどらないるオプション(-P)とシンボリックリンクをたどるオプション(-P)があって、オプションを指定しなかった時の既定値は以下の通り。

  1. –L (たどらない)
  2. –P (たどる)

CentOS 6.8既定の動作を確認した結果は以下の通り。

$ ls -l
total 8
drwxr-xr-x   2 user user  68  2 13 12:11 src
lrwxr-xr-x   1 user user   4  2 13 12:11 symlink -> src
$ cd symlink
$ pwd 内部コマンド(既定値は -L シンボリックリンクをたどらない)
/home/user/symlink
$ pwd -L
/home/user/symlink
$ pwd -P
/home/user/src
$ /bin/pwd 外部コマンド(既定値は -P シンボリックリンクをたどる)
/home/user/src
$ /bin/pwd -L
/home/user/symlink
$ /bin/pwd -P
/home/user/src

カレントディレクトリ移動(cd)

cdはカレントディレクトリを移動する。

指定したパスにカレントディレクトリを移動
cd パス
直前のカレントディレクトリ移動前のディレクトリに移動
cd -

離れたディレクトリを行き来するには、次項も参照。

移動先ディレクトリリストの利用・管理

離れたディレクトリを行き来するには、pushdpopddirsなどを使うと便利[5]
コマンド 内容 使用例など
dir ディレクトリスタック一覧表示
pushd ディレクトリ追加、移動 引数に「ディレクトリ」を指定すれば「ディレクトリスタックにディレクトリを追加し、そのディレクトリに移動」、引数に「+自然数」を指定すれば、ディレクトリスタックのn+1番目にあるディレクトリに移動する。引数を指定しないのと「+1」を指定するのは同じ。
popd 2番目のディレクトリに移動し、1番目のディレクトリをディレクトリスタックから削除する。
[user@mypc ~]$ pwd
/home/user
[user@mypc ~]$ pushd /tmp
/tmp  /home/user
[user@mypc ~]$ dirs
/tmp  /home/user

ディレクトリ作成(mkdir)

mkdir オプション ディレクトリ名
  
-m モード
--mode=モード
作成されるディレクトリのパーミッションを指定する。"+"や"-"による相対パーミッション指定を行う場合、初期状態は"a=rwx"(全員読み書き実行可能、777)として解釈される。
-p
--parent
必要に応じ、途中のディレクトリも作成する。このオプションを指定せず、途中のディレクトリが存在しない場合はエラーになる。逆にこのオプションを指定し、途中のディレクトリが既に存在した場合でもエラーにはならない。途中に作成されるディレクトリのパーミッションは、rwxrwxrwx(777)に現在のumaskの修正を加えたものに、所有者に対する書き込みと検索パーミッションが加わった値。
【例】
shell> ls
※まだ何もサブディレクトリはない
shell> mkdir -p foo/bar
shell> ls
foo
shell> ls foo
bar
-v
--verbose
ディレクトリを作成するごとに作成した内容を表示する。--parentオプションと合わせて使用すると役立つ。

参考文献・サイト:

複数ファイルの一括ファイル名変更

renameコマンドを使う。書式は以下の通り。但し、Macのターミナル(bash)では使えないみたい。CentOS5.2では使えた。

rename (検索文字列) (置換文字列) (検索ファイル名)
  

Ubuntuでは使い方が違った。

rename オプション Perl表現 ファイル名
  

オプション

-v, --verbose
ファイル名変更がうまくいったファイルの名称を表示する。
-n, --no-act
名前が変更されるファイルの名称を表示するだけでファイル名の変更は実行しない。
-f, --force
変更先のファイル名を持つファイルが既に存在しても上書きする。
Perl表現
Perl表現文字列。前後はシングルクォートで囲む。例:'s/\.bak$//'(ファイル名が.bakで終わるファイルの.bakを除去する)。
ファイル名
ワイルドカード(*、?)使用可能。指定しなかった場合、標準入力からの入力が用いられる。

検索ファイル名にはワイルドカード(?:任意の1文字、*:任意の0文字以上の文字列)が使える。

例:abc01.jpg, abc02.jpg, ... というファイル群のファイル名に含まれる "abc" を "xyz" に変える。

> ls abc0?.jpg
abc01.jpg  abc02.jpg  abc03.jpg  abc04.jpg
> rename abc xyz abc0?.jpg
> ls abc0?.jpg
xyz01.jpg  xyz02.jpg  xyz03.jpg  xyz04.jpg
  

ファイル名を全て小文字に変換する。スクリプトファイルを用意する。

[downcase.sh]
#!/bin/sh
for f in *
do
  mv $f `echo $f | tr '[A-Z]' '[a-z]'`
done

[処理]
chmod +x downcase.sh
./downcase.sh *
  

これならrenameコマンドでできる。

rename 'tr/A-Z/a-z/' *
  

参考文献・サイト:

ls コマンドと perl コマンドをパイプでつないで処理する方法もあるようだが、前項の rename コマンドの方が手軽と思われる。

例:"jV_manual" で始まり ".html" で終わるファイル名から最初の"jV_" を削除する。

ls -1 jV_manual*.html | perl -n -e 'if(s/^(jV_manual)(.+)(\.html)/mv $1$2$3 manual$2$3/){system($_)};'

----

01:ls -1 jV_manual*.html "jV_manual" で始まり ".html" で終わるファイルを各エントリー1行で表示する
02:| 01の結果を次に渡す
03:perl -n -e ループ動作を(-n)今すぐ実行(-e)
04:'if(05) ...の内容に合致すれば、
05:s/06/07/ 06のパターンに一致するものを07に置換する
06:^(jV_manual)(.+)(.html) jV_manualで始まり($1)、その後に1文字以上($2)あって、更に.html($3)が来るもの
07:mv $1$2$3 manual$2$3 mv 元のファイル名 manual$2$3
  

次のような方法もある。

【例】「mom(数字3文字).html」→「mom(数字3文字)_1.html」(拡張子前に「_1」を挟む)
ls -1 | egrep '^mom[0-9]{3}\.jmol$' | sed -E 's/(mom[0-9]{3})(\.jmol)/mv -i \1\2 \1_1\2;/' | /bin/sh
※sed コマンドの拡張正規表現を有効にするオプションは、Mac の bash では "-E" だったが、CentOS 5.4では "-r"だった。

【例】1abcで始まり_???.xml(???は数字3文字)で終わるファイルの???の前に0を挿入(数値を4桁に)
ls -1 | egrep '^1abc.*_[0-9]{3}\.xml$' | sed -r 's/^(1abc.*_)([0-9]{3}\.xml)$/mv \1\2 \10\2/' | /bin/sh

1abc-bb-1_001.xml → 1abc-bb-1_0001.xml

----
01:ls -1 ファイル名一覧を各行に1エントリーずつ表示する
02:| 01の結果を次に渡す
03:egrep 'mom[0-9]{3}\.jmol$' 「mom(数字3文字).html」に一致する行(ファイル名)のみ抽出
04:sed -E 's/(mom[0-9]{3})(\.jmol)/mv \1\2 \1_1\2;/' 拡張正規表現を使って(-E)
   「mom(数字3文字).html」を「mv mom(数字3文字).html mom(数字3文字)_1.html」
  最後のセミコロンは1行に複数のコマンドを書くためのコマンド間区切り。
05:/bin/sh シェルコマンドとして解釈して実行
  

参考サイト:ITメモ帳 - UNIX/Perl/複数ファイルのファイル名を一気に変更

参考サイト:Perl第4回:PerlTips(コマンドラインオプション)

ファイルの表示・結合(cat)

ファイルを読み込んで出力する。既定の出力先は標準出力、つまりファイルの内容が画面に表示される。リダイレクト(>)を使ってファイルに出力することもできる。

【書式】
cat -benstuv ファイル名 ファイル名...
  

オプション

-b
空白行以外に1から始まる行番号を付ける。
-e
非表示文字を見える形で表示し(-vオプションの動作)、各行の最後に"$"を付ける。
-n
空白行も含め1から始まる行番号を付ける。
-s
連続した空行は1つの空行に圧縮する。
-t
非表示文字を見える形で表示し(-vオプションの動作)、タブを"^I"で表示する。
-u
出力のバッファリングを行わなわず、1行毎に処理していく。このオプションを指定しないと、全てを一旦バッファリングしてから処理する。
-v
非表示文字を見える形で表示する。「Control + X」→「^X」、削除文字(16進7F)→「^?」、非ASCII文字(最上位ビット1、16進80以降)→「M - 」の後に残り7ビットで表される文字
【例1】標準入力の内容をファイルに書き出す
shell> cat - test.txt
aiueo
^D
※標準入力はハイフン( - ) で表す。第2引数で出力先を示す。
MS-DOSの"COPY CON (ファイル名)"に相当するもの。

【例2】1行入力するごとに、ファイルに出力していく。
shell> cat -u - test.txt
aiueo
kakikukeko
^D

【例3】既存ファイルに追記していく。
shell> cat -u - >>test.txt
3.141592653589793238
2.7182818284
^D
  

出力を行うファイルは複数指定して連結(concatenate)することも可能。

【例4】file1.txt の内容の後に file2.txt の内容を加えて file_all.txt に書き出す
shell> cat file1.txt file2.txt > file_all.txt
  

圧縮されたテキストの内容を(解凍せず直接)表示するにはzcatコマンド1が使える。

参考文献・サイト

  1. 【 zcat 】 gzipやcompressで圧縮されたファイルの内容を表示する - Linuxコマンド集:ITpro

ファイルの一部を見る

headコマンド、tailコマンドを使うとファイルの先頭部分や末尾部分だけを表示することができる。

【書式】
head オプション ファイル名 ,ファイル名...
tail オプション ファイル名 ,ファイル名...
  

オプション

-c --bytes=
表示末端位置をバイト単位で指定する。値がどこからのバイト数を意味するかは以下の通り。
  • head...無符合→ファイルの先頭から、頭に"-"を付ける→ファイルの末尾から
  • tail...無符合→ファイルの末尾から、頭に"+"を付ける→ファイルの先頭から
また、値として数値の直後に"b","k","m"を付けると、それぞれ数値を512、1024、1048576倍した意味になる。
-n --lines
表示範囲を行単位で指定する。数値の意味は-cオプションと同じ。
-F
指定したファイル名に名前やinode番号などの変更をtailコマンドが検知した場合、ファイルを閉じて開き直す。入力がファイルではなく標準入力の場合、このオプションは無視される。
-f
ファイルの最後に達してもtailコマンドを終了せずに入力に追加されるデータを待ち、追加データが発生次第追加表示を行う。継続的に追記されるログファイルなどの表示内容を追跡するのに有効。
-r
行ごとに逆順表示。指定したファイル名に名前やinode番号などの変更をtailコマンドが検知した場合、ファイルを閉じて開き直す。入力がファイルではなく標準入力の場合、このオプションは無視される。
-v--verbose
常に指定されたファイルのヘッダーを表示する。
ファイル名
表示対象となるファイルの名前。指定が無かった場合は標準入力(通常はキーボード)からの入力内容を対象とする。

オプションの指定が無かった場合の既定の動作は、headの場合先頭から10行表示(head -n 10)、tailの場合末尾から10行表示(tail -n 10)。

複数のファイルを指定した場合は、ファイル名も合わせて出力される。形式は「===> ファイル名 <===

一部オプションはシステムによっては利用できないものがあるよう(Mac OS X 10.4.11 では headの位置指定値に"-"を付けるとエラーになった)。

【例1】file1.txt の末尾20行目を file1_last20.txt に出力する。
tail -n 20 file1.txt > file1_last20.txt
【例2】file1.txt の20行目〜末尾を file1_20toend.txt に出力する。
tail -n +20 file1.txt > file1_20toend.txt
【例3】file1.txt の先頭20行目を file1_head20.txt に出力する。
head -n 20 file1.txt > file1_head20.txt
【例4】file1.txt の先頭〜末尾より20行目までを file1_headtolast20.txt に出力する。
head -n -20 file1.txt > file1_headtolast20.txt
  

参考文献・サイト:

テキストを見る(less)

lessコマンドはテキストファイルの閲覧を行う。viと似た操作インタフェースを持つがviのように編集することはできない。

【書式1】指定ファイルを閲覧する
less オプション ファイル名
【書式2】ヘルプを表示して終了する。
less -?
less --help
【書式3】バージョン情報を表示して終了する。
less -V
less --version
  

オプション

-n
行番号を表示しない(既定値)
-N
行番号を表示する

以下にless画面内で使用できるコマンドについて記す。"+" は前のキーを入力してから後のキーを入力する(例:ESC + v → ESCを入力してからvを入力)。"-" は前後のキーを同時に入力する(例:Ctrl-v → Ctrlキーを押しながらvを入力)

システムによっては既に他の用途に割り当てられてlessのコマンドとしては使えないものもありえる。

ヘルプと終了

コマンド 動作内容
h コマンドの概要を表示。
H
q lessを終了する。
:q
Q
:Q
ZZ

カーソル移動コマンド

コマンド 動作内容 備考
そのまま 前に数値Nあり
e 下に1行スクロール 下にN行スクロール ファイルの末尾に到達した場合はそれ以上スクロールしない。
Ctrl-E
j
Ctrl-N
RETURN
y 上に1行スクロール 上にN行スクロール ファイルの先頭に到達した場合はそれ以上スクロールしない。
Ctrl-Y
k
Ctrl-K
Ctrl-P
f 下に1Window分スクロール 下にN行スクロール
  • ファイルの末尾に到達した場合はそれ以上スクロールしない。
  • Windowsサイズ(初期値はターミナル画面の縦行数)は変更しない
Ctrl-F
Ctrl-V
SPACE
b 上に1Window分スクロール 上にN行スクロール
  • ファイルの先頭に到達した場合はそれ以上スクロールしない。
  • Windowsサイズ(初期値はターミナル画面の縦行数)は変更しない
Ctrl-B
ESC+v
z 下に1Window分スクロール 下にN行スクロール
  • ファイルの末尾に到達した場合はそれ以上スクロールしない。
  • Windowsサイズ(初期値はターミナル画面の縦行数)をNに変更する
w 上に1Window分スクロール 上にN行スクロール
  • ファイルの先頭に到達した場合はそれ以上スクロールしない。
  • Windowsサイズ(初期値はターミナル画面の縦行数)をNに変更する
ESC-SPACE
下に1 Window分の行数だけスクロールする。ファイルの末尾に到達してもスクロール行数は同じ。
:n
複数のファイルを読み込む指定を行っていた場合、次のファイルに表示を切り替える。
:p
複数のファイルを読み込む指定を行っていた場合、前のファイルに表示を切り替える。
d、Ctrl-d
前方に N 行スクロールする。既定の動作は前へ半ウインドウ分スクロール。 コマンドの前に10進数 N を付けるとスクロール行数を指定できる。N を指定するとその後の d コマンドと u コマンドの新しい既定スクロール行数がその指定値に変更されます。
前に何も値を指定しなかった場合、下に1 Window分の行数だけスクロールする。1 Windows行数の既定値はターミナル画面の縦方向表示行数。コマンドの直前に整数 N を指定すると、Window行数を変更せず、前方にN行スクロールする。
SPACE、Ctrl-vf、Ctrl-f
前方に N 行スクロールする。既定の動作は前へ1ウインドウ分スクロールz オプション参照)。 N が画面サイズより大きい場合は、最後の表示可能な部分のみが表示される。なお、システムによっては Ctrl-v が特殊な機能打ち消し文字に割り当てられていてこの用途では使えない。
/パターン
指定したパターン(正規表現)を前方検索(ファイルの末尾に向かって検索)する。既定の動作は最初に見つかったパターン。 コマンドの前に10進数 N を付けると N 番目にヒットしたパターンへ移動する。既定の検索開始位置は画面に表示されている第2行(a オプションと j オプションで変更可能)。以下の文字をパターンの始めに置くと特殊な意味を持ち、パターンの一部を構成するのではなく検索方法を変更する役割を持つ。
Ctrl-n!
パターンにマッチしない行を検索する。
Ctrl-e*
複数のファイルに対して検索を行う。ヒットしないまま処理中のファイルの末端に到達した場合、コマンドラインリストにある次のファイルで検索を続行する。
Ctrl-f@
現在の画面表示や aj オプションの設定に関係なくコマンドラインリストの最初のファイルの先頭行から検索を開始する。
Ctrl-r
パターンを正規表現として解釈せず、単純な文字列として比較を行う。
u、Ctrl-u
後方に N 行スクロールする。既定の動作は後へ半ウインドウ分スクロール。 コマンドの前に10進数 N を付けるとスクロール行数を指定できる。N を指定するとその後の d コマンドと u コマンドの新しい既定スクロール行数がその指定値に変更されます。
b、Ctrl-b、ESC + v、Ctrl-f
後方に N 行スクロールする。既定の動作は後へ1ウインドウ分スクロールz オプション参照)。 N が画面サイズより大きい場合は、最後の表示可能な部分のみが表示される。
?パターン
指定したパターン(正規表現)を後方検索(ファイルの先頭に向かって検索)する。既定の動作は最初に見つかったパターン。 コマンドの前に10進数 N を付けると N 番目にヒットしたパターンへ移動する。既定の検索開始位置は画面の最上行の1つ前の行(a オプションと j オプションで変更可能)。以下の文字をパターンの始めに置くと特殊な意味を持ち、パターンの一部を構成するのではなく検索方法を変更する役割を持つ。
Ctrl-n!
パターンにマッチしない行を検索する。
Ctrl-e*
複数のファイルに対して検索を行う。ヒットしないまま処理中のファイルの先頭に到達した場合、コマンドラインリストにある前のファイルで検索を続行する。
Ctrl-f@
現在の画面表示や aj オプションの設定に関係なくコマンドラインリストの最後のファイルの最終行から検索を開始する。
Ctrl-r
パターンを正規表現として解釈せず、単純な文字列として比較を行う。
動作 前(次) 後(前) 備考
1行 RETURN、(Ctrl-)e、(Ctrl-)n、(Ctrl-)j (Ctrl-)y、(Ctrl-)k、Ctrl-p 左記コマンドの前に数値を付加すると移動行数を指定したことになる(例:3 + e → 3行下に移動)。
半ウインドウ (Ctrl-)d (Ctrl-)u
1ウインドウ SPACE、Ctrl-vf、Ctrl-f b、Ctrl-b、ESC + v、Ctrl-f
ファイルの末尾 g、<、ESC+< G、>、ESC+>
パターン検索 /パターン ?パターン
ファイル :n :p 複数ファイルが読み込まれた場合。

圧縮されたテキストの内容を(解凍せず直接)表示するにはzlessコマンドが使える。

ファイルを開こうとすると「バイナリファイルでも開く?」と聞かれ、それでも開くと日本語が化けてしまう時、LESSCHARSET環境設定を端末の表示に用いている文字コードに合わせるといいらしい[27]

【例】utf-8に設定する
$ export LESSCHARSET=utf-8

参考文献・サイト

行数、単語数、文字数、バイト数を数える(wc

行数、単語数、文字数、バイト数を数える。オプションを指定した場合、指定した値とファイル名だけを表示。 オプションを指定しない場合は-clwを指定した場合と同じ(行数、単語数、バイト数、ファイル名を出力)。 行は改行文字で区切られた文字列、単語は空白文字で区切られた文字列を指す。 複数のファイルを指定した場合、最後に行数、単語数、バイト数の各項目別合計も表示。

【書式】
wc [-clmw] [ファイル名 ...]
  

オプション

-c
指定したファイルのバイト数を標準出力に表示。
-l
指定したファイルの行数を標準出力に表示。
-m
指定したファイルの文字数を標準出力に表示。
-w
指定したファイルの単語数を標準出力に表示。
【例】
shell> wc test.csv
   70502   140986 34921932 test.csv
   ↑行数   単語数 バイト数 ファイル名
  

参考文献・サイト:

  • UNIXマニュアル(man wc

ファイル分割(split)

【書式】
split オプション ファイル名 接頭辞
  

オプション

-b バイト数
指定バイト数ごとにファイルを分割する。数値の末尾にkを付けるとキロバイト、mを付けるとメガバイト単位の指定となる。
-l 行数
指定した行数ごとにファイルを分割する。

ファイル名はワイルドカード使用可能。

接頭辞は分割後ファイルの先頭がこの文字列となる。この後に2文字のアルファベットを昇順で付加したファイル名で分割後ファイルが作成される。"pre_"を指定すれば"pre_aa","pre_ab",...となる。既定値は"x"。

参考文献・サイト:

並べ替え(sort

sortコマンドはテキストファイルを行単位で並べ替える。複数のファイルを引数に指定した場合は、全てのファイルを結合したものが並べ替え対象となる。

sort オプション ファイル名...
  

並べ替え順オプション

-r
逆順(降順)で出力する。
-n
数字列として比較する。文字列は0扱い。

正規表現抽出

選択(|)はegrepでないと使えない。

【例】Apacheログから、以下の条件のログを抽出
・2010年2月分
・/eprots/index_ja.cgi または /jp.cgi へのアクセス
・抽出内容は access_log_eprotsja.201002 へ出力
shell> egrep 'Feb\/2010.+(GET \/eprots\/index_ja\.cgi|GET \/jp\.cgi)' access_log > ~/access_log_eprotsja.201002
xxx.xxx.xxx.xxx - - [01/Feb/2010:00:00:18 +0900] "GET /eprots/index_ja.cgi?PDB%3a1SMD HTTP/1.1" 200 5736 "-" "Mozilla/5.0"
...
  

複数ファイルの内容を一括検索

grepコマンドで可能。但し、返るのは検索語句にマッチした行全体。

【書式】
grep '検索語句' 検索ファイル名
grep -r '検索語句' 検索ディレクトリ名
【例】カレントディレクトリにあるhtmlの中から'hoge'を検索
grep 'hoge' *.html
  

検索語句には正規表現も使える(-Eオプションを付けるか、egrepコマンドを使用)。

あるいはperlでも可能。

perl -ne 'print if(m/検索パターン/修飾子)' 対象ファイル名
  

参考文献・サイト:

複数ファイルの内容を一括置換

perlコマンドの置換演算子を利用。パターンの指定については正規表現のPCRE(Perl互換)を参照のこと。

【書式1】直接コマンドラインでパターン指定
perl -piバックアップファイルの拡張子 -e 's/検索パターン/置換パターン/修飾子' 対象ファイル名
【書式2】別ファイルでパターン指定
perl -piバックアップファイルの拡張子 スクリプトファイル名 対象ファイル名

<スクリプトファイル例>
s/^\n//g;
s/ +$//g;
  

バックアップファイルの拡張子を省略すると元のファイルは置換後のファイルで上書きされる(元のファイルはバックアップされない)。

修飾子の内容は以下の通り。

修飾子 意味、機能
e 置換文字列を式とみなして実行する
g マッチするものを全て置換する(これを指定しないと最初にマッチした1個だけを置換する)
i 大文字と小文字を区別しない
m 文字列を複数行として扱う(^,$ はそれぞれ行先頭、行末尾として処理)
s 文字列を単一行として扱う(^,$ は \n を無視)

大文字を小文字に置き換えるといった場合には変換演算子を使う。

perl -piバックアップファイルの拡張子 -e 'tr/A-Z/a-z/g' 対象ファイル名
  

また、パターンを記述する際、エスケープが必要な文字列は以下の通り。これら文字はパターン内で用いると特別な意味を持つため、これら文字自体を示したい時は直前に円マーク(又はバックスラッシュ)を記述する。

\ * + . ? { } ( ) [ ] ^ $ - | /
  

また検索置換パターンをシングルクォート(アポストロフィ、')で囲っている場合、パターン文字列中にそのままシングルクォートを記すとパターン記述を途中で終えてしまうことになる。この場合、シングルクォートの直前にバックスラッシュを置いてエスケープした上でこの2文字をシングルクォートで囲む(例:シングルクォートをダブルクォートに置換するパターン 's/'\''/"/g')[2]

例1:カレントディレクトリ内にあるファイルで、ファイル名に"pdb"が含まれ、"pdb"の後に0文字以上の文字、続いて".html"が来るファイルを検索し、ファイル内に含まれる "www.rcsb.org" を全て "www.pdb.org" に置換する。元のファイルは拡張子.bakでバックアップ。

perl -pi.bak -e 's/www\.rcsb\.org/www\.pdb\.org/g' pdb*.html
  

例2:例1でバックアップを取らない場合。

perl -pi -e 's/www\.rcsb\.org/www\.pdb\.org/g' pdb*.html
  

例3:カレントディレクトリにある、拡張子が ".html" のファイルに含まれる "bmrbdep.protein.osaka-u.ac.jp/index.html" という文字列を全て "bmrb.protein.osaka-u.ac.jp/search/" に置換する。元のファイルはファイル名に ".bak" を付加してバックアップ。

perl -pi.bak -e 's/(bmrb)(dep)(\.protein\.osaka-u\.ac\.jp\/)(index\.html)/$1$3search\//g' *.html
  

例4:"query=PDBID">PDBエントリー:PDBID" という文字列のPDBID(大文字)を全て小文字に変換。 対象はカレントディレクトリにあるhtmlファイル全部。

perl -pi.bak -e 's/(query=)([1-9][0-9A-Z]{3})(">PDB.*?:)([1-9][0-9A-Z]{3})/$1\L$2\E$3\L$2\E/g' *.html
  

例5:h1要素全てを取り除く。対象はカレントディレクトリにあるhtmlファイル全部。

perl -pi.bak -e 's/<h1>.+<\/h1>\n//g' *.html
<h1>任意の1文字以上の文字列</h1>(改行)
スラッシュ自体の指定には、直前にバックスラッシュを置いてエスケープ
  

例6:<PDBx:... />(名前がPDBxで始まる空要素の簡略表現)を正規の表現に戻す。

perl -e 's/<(PDBx:.+)( .*) \/>$/<$1$2><\/$1>/g' *.xml
<PDBx:hoge xsi:nil="true" /> → <PDBx:hoge xsi:nil="true"></PDBx:hoge xsi:nil="true">
  

例7:「Version 3.8.1,   15 September 2010」→「Version 3.8.2,   4 October 2010」

perl -e 's/(Version 3\.8\.)1(, \  )(15 September )(2010)/${1}2${2}4 October ${4}/g' *.html
  

例8:「<span class="vol">任意の文字列</span>,.* 」→「<span class="vol">任意の文字列</span>」 (class="vol"のspan要素の直後のコンマとそれ以降の文字列を除去)

perl -e 's/(<span class="vol">.*<\/span>),.*/$1/' *.html
  

's///'内各要素の意味

複雑な長いパターンを記述する際、別のファイルにスクリプトとして記述して実行する方が扱いやすい。

【書式1】上書き
perl -p スクリプトファイル名 置換対象ファイル名
【書式2】バックアップをとる
perl -piバックアップ拡張子 スクリプトファイル名 置換対象ファイル名

【例5】
対象ファイル:ファイル名が「mom」で始まり、「.html」で終わるファイル
検索文字列:
<a href="http://pdbjs8.pdbj.org/xPSSS/xPSSSSearch?search_type=pdbid_search&amp;query=PDBID">PDBエントリー:PDBID</a>
置換文字列:PDBエントリー:[[PDB:PDBID]]
※PDBIDは4文字の数字または英小文字。

<replace.pl>
----
s/<a href="http:\/\/pdbjs8\.pdbj\.org\/xPSSS\/xPSSSSearch\?search_type=pdbid_search&amp;query=([0-9a-z]{4})">
(PDBエントリー:)[0-9a-z]{4}<\/a>/${2}[[PDB:${1}]]/g;
----
※パターンは複数記述できる。パターン間を区切る";"で改行してもよい。
(上記例は見やすいよう途中改行しているが、実際は1行で記述する)

shell> perl -pi.bak replace.pl mom*.html
  

改行を含む(=複数行にわたる)文字列の置換がうまくいかない。

検索対象ファイル(test.txt)の内容は以下の通り。

abcde
fghij
  

例4:改行を2個に増やす(うまく行く例)

perl -pi.bak -e 's/(¥n)/$1$1/g' test.txt
  

例5:"abcde"と改行の間に"zzz"を挟む(うまく行く例)

perl -pi.bak -e 's/(abcde)(¥n)/$1zzz$2/g' test.txt
  

例6:改行と"fghij"の間に"zzz"を挟む(うまく行かない例、元ファイルは何も変化しない)

perl -pi.bak -e 's/(¥n)(fghij)/$1zzz$2/g' test.txt
  

参考サイト、文献:

ワイルドカード、正規表現など

?
任意の1文字
例:
c??.txt

適合例:c00.txt、cat.txt
不適合例:c0.txt、cat.jpg、caaa.txt、a00.txt
*
任意の0文字以上
例:
c*.txt

適合例:c.txt、c0.txt、cat.txt、caaa.txt
不適合例:a0.txt、cat.jpg
[ ]
[ ]内の任意の1文字。文字を列挙または範囲で指定。
例:
c[123xyz].txt

適合例:c1.txt、cx.txt
不適合例:c4.txt、c1.jpg、c11.txt
例:
c[5-9].txt

適合例:c5.txt、c7.txt、c9.txt
不適合例:c4.txt、c5.jpg、c66.txt

ファイル所有者、グループの変更(chown、chgrp)

ファイルやディレクトリの所有者、グループ名は ls コマンドでは次の位置に表示される。

> ls -l
total nn
drwxr-xr-x  5 user  group  nnn mm dd hh:mm ./
drwxr-xr-x  5 user  group  nnn mm dd hh:mm ../
-rw-r--r--  1 user  group  nnn mm dd  yyyy file01
-rw-r--r--  1 user  group  nnn mm dd  yyyy file02
...
  

所有ユーザを変更するには chown コマンドを用いる。変更できるのはスーパーユーザのみ。

> chown user2 file01
> ls -l
total nn
drwxr-xr-x  5 user   group  nnn mm dd hh:mm ./
drwxr-xr-x  5 user   group  nnn mm dd hh:mm ../
-rw-r--r--  1 user2  group  nnn mm dd  yyyy file01
-rw-r--r--  1 user   group  nnn mm dd  yyyy file02
...
  

chown -R(またはchown --recursive)とすればサブディレクトリに対しても変更が適用できる。chgrpも同様。

参考サイト:

所属グループを変更するには chgrp コマンドを用いる。変更できるのは所有者自身またはスーパーユーザのみ。変更先グループは所有者が所属するグループでなければならない。 ディレクトリ内の全ファイル、ディレクトリのグループを一括変更するには -R オプションを付ける。

> chgrp group2 file01
> ls -l
total nn
drwxr-xr-x  5 user   group   nnn mm dd hh:mm ./
drwxr-xr-x  5 user   group   nnn mm dd hh:mm ../
-rw-r--r--  1 user2  group2  nnn mm dd  yyyy file01
-rw-r--r--  1 user   group   nnn mm dd  yyyy file02
...
  

参考サイト:

ファイルの権限を変更する(chmod)

chmod a+x filename

1文字目:ユーザ表記。u:所有者、g:グループ、o:その他、a:全て
2文字目:権限指定。+:3文字目の権限を付加、-:3文字目の権限を削除、=:3文字目の権限に変更
3文字目:権限表記。r:読み出し権限、w:書き込み権限、x:実行権限

なお、1文字目のユーザ表記を省略した場合は、自分自身(whoコマンドで表示される)に対応する値が指定されたものとみなされる。

chmod nnn filename

数字表記の指定。
1文字目:所有者の権限指定。読み出し可能=4、書き込み可能=2、実行可能=1 の合計。
2文字目:グループの権限指定。
3文字目:その他の権限指定。

例えば、"755"と指定すれば、所有者は読み出し、書き込み、実行可能、グループ・その他は読み出しと実行のみ可能(書き込み不可)。

参考:UNIXコマンド [chmod]
【書式1】 stat オプション ファイル名 【書式2】ヘルプ(manページの内容)を出力して終了する stat --help 【書式3】バージョン情報を出力して終了する stat --version
-c 書式指定
--format=書式指定
既定の書式ではなく、指定した書式で出力を行う。
-f
--file-system
ファイルの状態ではなく、ファイルシステムの状態を出力する。出力の末尾には改行が付加される。
-L
--dereference
シンボリックリンクファイルであった場合、元ファイルをたどって元ファイルの情報を表示する。
--printf=書式指定
--format と似ているが、バックスラッシュによるエスケープが使える。末尾の改行は自動的には付加されない。改行を出力するには\nを記す。
-t
--terse
terse形式で情報を出力する。
-Z
--content
SElinuxのセキュリティ分類情報を出力する。

ファイルに対して利用できる書式指定子は以下の通り。

書式 内容
%a 8進数形式で表示したアクセス権
$ stat somedir --format %a
755
$ stat somefile --format %a
644

ファイル比較(diff,fc)

diff

ファイルを1行ごとに比較してその結果を出力する。

【書式】
diff オプション ファイル名
【例】オプションなし
$ diff -c 1gix.cif.orig 1gix.cif
6c6
< _audit_conform.dict_version    4.031 
---
> _audit_conform.dict_version    4.032
-a
--text
全てのファイルをテキストファイルとして扱う。
-c
-C 行数
--context=行数
違いのある行およびその前後、指定した行数を出力する。違いのない部分も含め、元ファイルと比較ファイルそれぞれ出力される。また冒頭には比較したファイル名やタイムスタンプ情報も出力される。-cを指定した場合、および--contextで行数を指定しなかった場合は3行。
$ diff -c 1gix.cif.orig 1gix.cif
*** 1gix.cif.orig       2014-05-23 16:08:09.000000000 +0900
--- 1gix.cif    2014-05-23 16:08:23.000000000 +0900
*************** 元ファイルの記述
*** 3,9 ****
  _entry.id   1GIX 
  # 
  _audit_conform.dict_name       mmcif_pdbx.dic 
! _audit_conform.dict_version    4.031 
  _audit_conform.dict_location   http://mmcif.pdb.org/dictionaries/ascii/mmcif_pdbx.dic 
  # 
  loop_
--- 3,9 ---- 比較ファイルの記述
  _entry.id   1GIX 
  # 
  _audit_conform.dict_name       mmcif_pdbx.dic 
! _audit_conform.dict_version    4.032 
  _audit_conform.dict_location   http://mmcif.pdb.org/dictionaries/ascii/mmcif_pdbx.dic 
  # 
  loop_
-u
-U 数値
--unified=数値
違いのある行およびその前後、指定した行数を出力する。違いのない部分は1度だけ出力し、違いのある部分は元ファイルと比較ファイルの内容を続けて出力する。また冒頭には比較したファイル名やタイムスタンプ情報も出力される。-uを指定した場合、および--unifiedで行数を指定しなかった場合は3行。
$ diff -u 1gix.cif.orig 1gix.cif
--- 1gix.cif.orig       2014-05-23 16:08:09.000000000 +0900
+++ 1gix.cif    2014-05-23 16:08:23.000000000 +0900
@@ -3,7 +3,7 @@
 _entry.id   1GIX 
 # 
 _audit_conform.dict_name       mmcif_pdbx.dic 
-_audit_conform.dict_version    4.031 
+_audit_conform.dict_version    4.032 
 _audit_conform.dict_location   http://mmcif.pdb.org/dictionaries/ascii/mmcif_pdbx.dic 
 # 
 loop_
-r
--recursive
サブディレクトリがあった場合サブディレクトリについても比較する。
-N
--new-file
ファイルが存在しない場合空として処理する?

違いがなければ何も出力されない。

参考:

ファイルにパッチを当てる(patch)

diffコマンドで生成した差分情報(パッチ)ファイルに基づき、ファイルの修正を行う。修正対象ファイルは通常、パッチファイルのファイル名から得られるが、対象ファイルが一つしかない場合、引数で元のファイルを指定することもできる。

オプションでパッチの種別を指定することができます。指定可能な種別には、コンテキスト(-c--context)、ed(--ed)、通常のdiff出力(-n--normal)、unified形式(--unified)が指定できます。指定がないと、どのタイプなのかを判別しようとします。コンテキストまたは通常のdiff出力の場合は、patchコマンドが直接解釈します。edが指定された場合は、パッチ内容がedエディタに引き渡されます。

【書式1】
patch オプション 元のファイル パッチファイル
【書式2】
patch -p数値 >パッチファイル
-b
--backup
オリジナルファイルを修正する前に、バックアップファイルを作成する。
-c
--context
パッチファイルをコンテキスト形式のdiff出力内容として解釈する。
--dry-run
パッチを当てた結果を表示するが、実際にはファイルの変更は行わない。
-n
--normal
パッチファイルを通常のdiff出力内容として解釈する。
【例】
$ cat test_original.txt
hoge
$ cat test_target.txt
hoge
$ cat test_modified.txt
hoge hoge
$ diff -c test_original.txt test_modified.txt
*** test_original.txt	2014-09-10 11:36:31.000000000 +0900
--- test_modified.txt	2014-09-10 11:36:59.000000000 +0900
***************
*** 1 ****
! hoge
--- 1 ----
! hoge hoge
$ diff -c test_original.txt test_modified.txt >test.patch
$ patch -c test_target.txt test test.patch
patching file test_target.txt
$ cat test_target.txt
hoge hoge

ファイル状態情報表示(stat)

statコマンドはファイルの状態を表示する。ファイルのアクセス権をrwxのような文字列ではなく数値で得たい場合にも使える[1]

【書式】
stat オプション ファイル名

【例】※RHEL/CentOS などFedora系
$ ls -l hoge.txt
-rw-r--r-- 1 user user 4096 2012-08-01 10:00:00 hoge.txt
$ stat --format=%a hoge.txt
644

バックアップ(rsync)

ファイルのバックアップ(コピー)を行う。異なるマシン間でもOK。 2回目以降はタイムスタンプを比較し、更新されているファイルだけが更新される。

基本的な使い方

【書式】
rsync オプション コピー元 コピー先
    

オプション

-a, --archive
アーカイブモードにする(-rlptgoDオプションを指定したのと同じ、サブディレクトリも対象とし(r)、シンボリックリンクはシンボリックリンクのまま(l)、ファイルの権限(p)日時(t)グループ(g)所有者(o)の情報は保持したまま、デバイスファイルはデバイスファイルのまま(D)コピーする)。
-b, --backup
このオプションを指定すると、コピー先に同名のファイルが存在した場合、コピー先ファイルは移動またはファイル名の変更が行われてから、転送または削除が行われる。--backup-dir または --suffix を使って、バックアップファイルの置き場所や拡張子を指定することができる。--backup-dirを指定しなかった場合、(1)--omit-dir-times オプションの指定がなくてもあるものとして扱われ、(2)--delete オプションも有効な状態であった場合(=--delete-excluded オプションを指定しなかった場合)、バックアップファイルを保護するためのフィルタールールを追加した上で処理され、既にバックアップされたファイルが削除されないようにします。但し、独自のフィルタールールを指定する場合、ルールリストのどこかでバックアップファイルを対象から除外するようなルールを他より優先するように追加する必要があります(例えば、"*" を含む/除外するという指定を行うと、自動的に付加されるバックアップファイル除外ルールは適用されません)。
--bwlimit=数値
入出力の通信帯域を 数値KByte/sec に制限する。
--delete
バックアップ元ファイルが削除されていた場合、バックアップ先でも削除する。
-e 通信プロトコル名
通信プロトコル名を指定する。指定しなければ既定のsshが用いられる。公開鍵認証を用いる場合、このオプションを使いプロトコル名(ssh)と共に鍵ファイル名を指定する(→公開鍵認証参照)。
-h, --help
ヘルプを表示して終了する。
--include=パターン
パターンに一致するファイルを対象に含める。ワイルドカードも使用可能。
パターン 意味
* 0文字以上の任意の文字列。但しスラッシュを除く。
** 0文字以上の任意の文字列。スラッシュも含む。
? 任意の1文字。但しスラッシュを除く。
[...] 文字クラスを記述する(例:[a-z]→英小文字、[[:alpha:]]→アルファベット)
\ 上記特殊文字を単純文字列として解釈させる(エスケープ)。
-l, --links
シンボリックリンクファイルはシンボリックリンクのままコピーする。
--link-dest=ハードリンク先ディレクトリ
未変更のファイルについてはハードリンク先ディレクトリへのハードリンクを作成する。
--copy-dest=コピー先ディレクトリ
未変更のファイルについてはハードリンク先ディレクトリへのハードリンクを作成する。
-L, --copy-links
シンボリックリンクファイルはリンク先ファイル・ディレクトリをコピーする。
-n, --dry-run
実行時の動作内容だけを表示し、実際には実行しない。実行に先立ち、このオプションをつけて実行内容を確認することができる。
-q, --quiet
エラー情報以外は出力しない。
-v, --verbose
詳細情報を出力する。
--version
バージョン情報を表示して終了する。
【例1】server.domain.org の /usr/local/docs/test*.html パターンに適合するファイルを
ローカルのカレントディレクトリにバックアップ。
アーカイブモード(a)で、経過の詳細を表示(v)し、通信を圧縮(z)して行う。通信プロトコルはsshを使う
rsync -avz -e ssh user@server.domain.org:/usr/local/docs/test*.html ./

【例2】例1でバックアップ元ファイルが削除されていた場合、バックアップ先でも削除する。
rsync -avz -e ssh --delete user@server.domain.org:/usr/local/docs/test*.html ./
    

--include=ファイルパターン, --exclude=ファイルパターンを用いて対象とするファイルを細かく指定可能。--include=, --exclude=は複数列挙できるが、数が増えてくると別ファイルに記述した上で--include-from=パターン記述ファイル名, --exclude-from=パターン記述ファイル名を使った方が便利。

【例3】server.domain.org の /usr/local/docs/ ディレクトリ以下のファイルをローカルの
カレントディレクトリにバックアップ。但しファイル名末尾が~であるものは除く。
アーカイブモード(a)で、経過の詳細を表示(v)し、通信を圧縮(z)して行う。通信プロトコルはsshを使う。
rsync -avz -e ssh --exclude=*~ user@server.domain.org:/usr/local/docs/* ./

【例4】server.domain.org の /usr/local/docs/ ディレクトリ以下のファイルをローカルの
カレントディレクトリにバックアップ。但し~/expattern.txtファイルに記載したパターンの
ファイル名を持つファイルは除く。
アーカイブモード(a)で、経過の詳細を表示(v)し、通信を圧縮(z)して行う。通信プロトコルはsshを使う。
rsync -avz -e ssh --exclude-from=~/expattern.txt user@server.domain.org:/usr/local/docs/* ./
(expattern.txt の例)
*~
*.log
*.bak
※各パターンはrsyncを実行するパスからの相対パスで記し、パターン間は改行で区切る。

【例5】ローカル・カレントディレクトリのhtml,css,jsファイルのうち更新されたものを
   サーバのホームディレクトリにアップロードする。
rsync -avz -e ssh --include=*.html --include=*.css --include=*.js --exclude=* * user@server.domain.org:~
※全部(*)ー全部(--exclude=*)+htmlファイル(--include=*.html)
 +cssファイル(--include=*.css)+jsファイル(--include=*.js)
 --include,--excludeの適用順は後ろに書いたものが先で、前に書いたもので上書きされる
    

公開鍵認証を使う

rsyncでリモートサーバへ接続する度にパスワードを聞かれないようにするには、SSH鍵を使ってログインするよう設定する15。設定方法は鍵認証ログイン - ssh参照。

【例】リモートマシン(dest)のホームディレクトリ以下をローカルマシンのホームディレクトリに同期
[user@local ~]$ rsync -avz -e "ssh -i ~/.ssh/id_dsa" user@dest:~/* ~

オプション部分を変数に設定してスクリプトで実行する場合、クォート記号を含む変数があってうまく動作しない。クォート内を別変数に定義しクォート記号は直接コマンド引数として記述すればうまく行く(→変数定義参照)。

rsyncサーバ

rsyncサーバを立ち上げる方法もある。

[Server]rsyncサーバ側の設定

/etc/rsyncd.conf ファイルを作成し以下の通り記す。パラメータは全般に適用するグローバルパラメータと、モジュール個別に適用するモジュールパラメータがあり、前者は最初のモジュール設定より前に記述する。モジュールパラメータをこのグローバル設定記述領域に記すと、各モジュール共通の既定値を設定したことになり、各モジュールでの設定はこの既定値を上書きする。

# グローバル設定領域
# motd file: クライアントがrsyncサーバに接続した時に表示されるメッセージ
#          (今日のメッセージ Messege Of The Day)内容の指定
motd file = motdファイル名

# pid file: rsyncデーモンのプロセスIDを書き込むファイルの指定
pid file = pidファイル名

# log file: アクセスログファイルの指定
log file = ログファイル名

# log format: アクセスログファイルの書式指定
log foramt = ログ書式指定
# %+1文字の指定子で出力したい内容を指定する。
# %と指定子文字の間に数字を記すことで出力幅、桁数を指定することもできる。
# log formatを指定しなかった場合の既定書式は「%o %h [%a] %m (%u) %f %l」で、
# log formatを指定すると常に「%t [%p]」が前に付加される。
# この既定書式のログを読み込んで要約するperlスクリプトが
# rsyncソースコードの support/rsyncstats に同梱されている
# %a : リモート(アクセス元)IPアドレス
# %b : 実際に転送された通信量(単位はバイト)
# %B : ファイルのアクセス権ビット(例:rwxrwxrwt)
# %c : 基本ファイル受信のためのブロックチェックサムの総容量?(送信時のみ)
# %f : ファイル名(long form on sender; no trailing “/”)
# %G : ファイルのgid値または「DEFAULT」
# %h : リモート(アクセス元)ホスト名
# %i : Updateされたものの一覧?
# %l : ファイルサイズ(単位はバイト)
# %L : 
# %m : モジュール名
# %M : 最終修正時刻
# %n : ファイル名(短い書式、ディレクトリの場合は末尾にスラッシュを付けない)
# %o : 操作内容(送信「send」受信「recv」削除「del.」)
# %p : rsyncセッションのプロセスID
# %P : モジュールのパス(ドキュメントルートのローカルパス?)
# %t : 現在日時
# %u : 認証済みユーザ名(無認証の場合は空文字)
# %U : ファイルのuid


# port: rsyncデーモンがアクセスを受け付けるlistenポートを指定する
# 指定がない場合の既定値は 873
# この指定はinetdで起動した場合は無視される
# またこの指定より --port コマンドラインオプションの方が優先する
port = ポート番号

# address: rsyncデーモンがアクセスを受け付けるlisten IPアドレスを指定する
# 指定がない場合は全ての有効なネットワークインタフェース全てで受け付ける
# この指定はinetdで起動した場合は無視される
# またこの指定より --address コマンドラインオプションの方が優先する
address = IPアドレス

# socket options: 転送速度の制御などを行うソケット設定変更設定を指定する
# 詳細は man setsockopt を参照のこと
# 指定がない場合の既定値は空(ソケットオプションはなし)
# またこの指定は --sockopts コマンドラインオプションでも指定できる
socket options = ソケットオプション

# rsyncクライアントからアクセスする際指定するモジュール名
[モジュール名] 
# comment: 任意のコメントを記述。クライアントが有効なモジュールの一覧を取得した時、モジュール名の後に表示される
comment = コメント文字列
path=/home/taro/data/   # バックアップ対象ディレクトリ
uid = root              ←このモジュールでデータ転送するときのユーザ名
gid = root              ←同じくグループ名
use chroot=false            ←ファイル転送する前にpathでchrootするかどうか
exclude=*~ ←除外パターン
exclude-from=~/ex.txt ←除外パターンを記したファイルを指定
include=*.html ←含むパターン
include-from=~/in.txt ←含むパターンを記したファイルを指定
secrets file=/etc/rsyncd.secrets ←認証で使われるパスワードファイル
auth users=root             ←接続を許可するユーザー名(なんでもいい)
hosts allow = 192.168.0.200 ←接続を許可するクライアント機のIPアドレス
hosts deny  = *             ←上記IP以外は拒否にする

chrootをon(true)にすると、セキュリティの向上にはつながるが、ドキュメントルートの外を参照できなくなる。タイムゾーンを規定している /etc/localtime も参照できないため、rsyncのログに残される時刻は世界標準時(GMT, UTC、日本時間−9時間)になってしまう。/etc/localtimeをドキュメントルートディレクトリにコピーすればローカル時間になる16が、rsyncコンテンツにlocaltimeファイルも入ってしまう?

[Server]パスワードファイルの設置

前項で指定したパスワードファイルを作成する。書式は以下の通り。

【書式】
ユーザ名:パスワード

【例】
rsync:password
[Server]rsyncサーバの起動
【書式】
rsync --daemon --config-file=設定ファイル名 --port=ポート番号

【例】
rsync --daemon --config-file=/etc/rsyncd.conf --port=10873

ポート番号を指定しない場合の既定値は873。OS起動時に自動起動するには上記コマンドを書いたシェルスクリプトをファイル名/etc/rc.d/init.d/rsyncdで保存し、chkconfigコマンドで起動を有効にしておく。

shell> sudo vi /etc/rc.d/init.d/rsyncd
#!/bin/sh
(上記のrsyncをデーモンとして起動するコマンドを記す)
shell> sudo /sbin/chkconfig --add rsyncd
shell> sudo /sbin/chkconfig rsyncd on

ただこれでは起動する指示しか書いていないので、以下のような起動・停止・再起動ができるようなスクリプトにしておく便利14

#!/bin/bash ←シェルのパス指定
PID=`ps -ef | grep 'rsync --daemon' | grep -v grep | gawk '{print $2}'` ←起動中rsyncデーモンのPID
CONF="/etc/rsyncd.conf" ←rsyncd設定ファイル
PROG="/usr/bin/rsync" ←rsyncプログラムのフルパスファイル名
PORT=873  ←ポート番号

case "$1" in ←引数により分岐
'start') ←引数が"start"の場合
  if [ -z "$PID"  ] ; then ←PIDが空だった場合
    "$PROG" --daemon --config="$PROG" --port="$PORT" ←rsyncd起動
    echo "    rsync                                                          [start]"
  else ←PIDが空でなかった場合
    echo " Error!  rsync already running" ←既に起動済みというエラーを吐く
  fi
'stop') ←引数が"stop"の場合
  kill $PID
  echo "    rsync                                                          [stop]"
'restart') ←引数が"restart"の場合
  $0 stop
  sleep 2
  $0 start
*) ←その他の場合は利用法を出力して終了する
  echo "Usage: $0 { start ¦ restart ¦ stop }"
exit 1
esac
exit 0

また xinetd から rsync デーモンを起動させる方法もある。デフォルトでは /etc/xinetd.conf に xinetd 共通の設定が、/etc/xinetd.d 配下にはサービス個別の設定が書かれており、rsync の場合 /etc/xinetd.d/rsync に記載される。内容は以下の通り。

【書式】
service サービス名 # サービス名は /etc/services に掲載されているものを指定する
{

}
【例】ネットワークごとに異なるrsyncサービスを提供する
service rsync
{
        disable = no
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/bin/rsync
        server_args     = --daemon --config=/etc/rsyncd1.conf
        log_on_failure  += USERID
        interface       = 192.168.1.1
}
service rsync
{
        disable = no
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/bin/rsync
        server_args     = --daemon --config=/etc/rsyncd2.conf
        log_on_failure  += USERID
        interface       = 192.168.2.1
}
[Client]パスワードファイルの設置
[Client]同期を行うコマンド実行
【例】
rsync -avz -e ssh --password-file=.passwd rsync://taro@rsync.hoge.com/db_bak_module ~/backup
【例】モジュール名一覧
rsync mysite.example.com::

【例】hogeモジュール以下をすべてダウンロード
rsync mysite.example.com::hoge/ .

差分バックアップを別ディレクトリに取る

画像の形式変換(convert)

ImageMagicは画像の生成、編集、変換などを行う[4]。コマンド名は「convert」。

【例】幅200px(縦横比は維持)でサムネイル画像を作る
convert -thumbnail 200 originalfile.jpg thumbnail.jpg

画像の形式、縦横サイズなどの情報を得る(identify)

ImageMagicコマンド群の1つidenfityを使って、画像のファイル形式、縦横サイズなどの情報を得られる[9]

【書式】
idenfity 画像ファイル名

【例】
$ idenfity hoge.jpg
hoge.jpg JPEG 250x500 250x500+0+0 DirectClass 50kb
ファイル名 ファイル形式 縦横ピクセル数 縦横ピクセル数+α? ? ファイルサイズ

PBS関係

ジョブの投入(qsub)

内容

「スクリプトを投入(submit)する」とは、スクリプトを実行する一括処理(バッチ処理)ジョブを生成することを意味します。スクリプトはバッチ処理サーバへ要求を行うことによって投入されます。qsub コマンドはユーザがバッチクライアントよりスクリプトを投入する操作を行うユーティリティです。

投入に成功すると、qsub ユーティリティは投入されたスクリプトを実行するバッチジョブを生成します。

qsub ユーティリティは「キュー」(Queue)、「ジョブ」(Job)、「リクエスト」(Request)を送信することによってスクリプトをバッチサーバに投入します。

qsub ユーティリティはバッチジョブの変数リスト属性中に以下の環境変数値を設定します。HOME, LANG, LOGNAME, PATH, MAIL, SHELL, TZ。環境変数名は頭に「PBS_O_」を付けた名前にすることが一般的です。

注:qsub ユーティリティの環境空間におけるHOME変数の現在値が /aa/bb/cc であった場合、qsub ユーティリティはバッチジョブの変数リスト属性に「PBS_O_HOME = /aa/bb/cc」と設定します。

上記の変数に関する事項に加え、指定の値を持つ次のような変数を変数リストに持ちます。

PBS_O_WORKDIR
qsub ユーティリティプロセスの現在の作業ディレクトリの絶対パス
PBS_O_HOST
qsub ユーティリティを実行しているノードのホスト名
書式
qsub オプション PBSスクリプト名 qsub オプション -- スクリプト名
PBSスクリプト名
冒頭にPBSの設定を記したスクリプトのファイル名。
【例】ジョブ名「hoge」でhoge.shを実行するジョブを投入(非Windowsの場合)
#!/bin/sh
#PBS -N hoge
/home/user/hoge.sh

【例】ジョブ名「hoge」でhoge.exeを実行するジョブを投入(Windowsの場合)
#PBS -N hoge
hoge.ext
オプション
qsub ユーティリティは IEEE 1003.1-2001、12.2 節、ユーティリティ構文ガイドラインに準拠しています。以下のオプションが利用できます。
-a 日時
バッチジョブの実行を開始する日時を指定します。qsub ユーティリティは、ここで指定した日時の現地時間に相当するEpoch時間(1970年1月1日 00:00:00 UTC からの積算秒数)を実行時刻(Execution_Time)属性の値にセットします。指定がない場合、ユーティリティが終了する時刻よりも早い何らかの時間をセットします。
-A アカウント名
バッチジョブを実行するアカウント名を指定します。アカウント名の書式は特に規定されていません。qsub ユーティリティはここに指定した値をバッチジョブの Account_Name 属性に設定します。指定がない場合、Account_Name 属性の指定は省略されます。
-c 間隔
-C directive_prefix
-e 標準エラーの出力先
-o で標準出力の出力先を指定するのと同様。既定のファイル名は「ジョブid.ER」、-e オプションの指定がない場合のファイル名は「ジョブ名.eシリアル
-h
-j 指定
ジョブの標準エラーと標準出力を統合するかどうかを指定する。指定できる値と動作内容は以下の通り。既定値は「n」(標準エラーと標準出力は統合しない)。
oe
標準エラーと標準出力の両方を標準出力に出力する。
eo
標準エラーと標準出力の両方を標準エラーに出力する。
n
標準エラーと標準出力は統合せず別々に出力する。
-k keep_list
-l リソースリスト
ジョブのリソースリスト属性を指定した内容に設定する。
例:ジョブ実行ノードをnode01に指定してジョブ投入を行う
qsub -l host=node01
-m mail_options
-M mail_list
-N ジョブ名
ジョブの名称とジョブの「Job_Name」属性の値をジョブ名で指定した値に設定する。ジョブ名に指定できる値は空白以外の表示可能な文字列で、字数は最大15文字。指定がない場合の既定値はスクリプト名。スクリプトを使っていない場合の既定値は「STDIN」。
-o 標準出力の出力先
ジョブ標準出力の出力先。相対パスの場合はコマンドのカレントディレクトリからの相対パスとして解釈される。パスの前に「ホスト名:」を付加することでリモートホストに対する指定を記述することもできる。
パス文字列にファイル名が含まれない場合は、デフォルトのファイル名として「ジョブid.OU」が用いられる。
-o オプションが指定されてなかった場合、qsub コマンドを実行したディレクトリに標準出力を複製する。ファイル名は「ジョブ名.oシリアル
-p 優先度
-q 投入先
ジョブの投入先サーバを指定する。既定値は既定のサーバにおける既定のキュー。キュー、サーバ、あるいは両者の組み合わせで投入先を指定できる。指定は以下の書式にて行う。
キュー
ジョブは既定サーバの、指定した名前のキューへ投入される。
@サーバ
ジョブは指定したサーバの、既定キューへ投入される。
キュー@サーバ
ジョブは指定したサーバの、指定した名前のキューへ投入される。
-r y | n
-S パス名リスト
-u ユーザリスト
-v 変数リスト
ここに列挙した変数が環境変数に追加されジョブに渡される。「変数名=値」の書式でコンマ区切りで記す(例:qsub -v a=10,"var2='A,B'",c=20,HOME=/home/foo foo.sh)。値の中にコンマを含む場合は必ずクォート記号類で囲む(例:qsub -v "var1='A,B,C,D'" hoge.sh)
-V
-z

ジョブの状態確認(qstat)

ジョブ状態の通常表示

qstatコマンドはジョブ、キュー、バッチサーバの状態を表示することができる。問い合わせた状態情報は標準出力に出力される。

出力様式には通常表示、別表示、詳細表示がある。通常表示および別表示では各要素の情報を1行に表示する。詳細表示では各要素に関する各属性情報が各行に表示される。

【書式】ジョブ状態の通常表示
qstat オプション ジョブIDまたは表示対象

【出力】
Job id   Name       User      Time Use S Queue
-------- ---------- --------- -------- - -----
...
-p
Time Use列の値is replaced with the percentage completed for the job. For an array job this is the percentage of subjobs completed. For a normal job, it is the larger of percentage used walltime or percentage used CPU time. Default format used.
-J
ジョブアレイの情報だけを表示する。
-t
ジョブ、ジョブアレイ、サブジョブの状態を表示する。-J オプションを一緒に用いた場合はサブジョブの情報だけを表示する。
-x
実行中、実行待ちのジョブに加え、終了したジョブや移動したジョブについても表示する。 但し、ジョブ履歴を記録するよう設定されている必要がある。
【出力例】
Job id   Name       User      Time Use S Queue
-------- ---------- --------- -------- - -----
15.sv    job        user      00:00:29 R workq           
16.sv    job        user      00:00:09 R workq           
17.sv    job        user      00:00:09 R workq           
18.sv    job        user      00:00:00 R workq           
19.sv    job        user             0 Q workq           
20.sv    job        user             0 Q workq           
21.sv    job        user             0 Q workq           
22.sv    job        user             0 Q workq     
Job id
PBSによって割り振られたジョブID(例:12345.server)
Name
ジョブを投入する際、投入した人が付けたジョブの名前
User
ジョブの所有者名(ジョブ投入を行ったユーザのユーザ名)
Time Use
ジョブがCPUを使用した累積時間
S
ジョブの状態。表示される値と内容は以下の通り。
内容
B 1つ以上のサブジョブが実行されているアレイジョブ
E ジョブの終了処理中(Exiting)
F ジョブ終了済み(Finished)
H ジョブ実行は保留中(held)
M ジョブは他のサーバに移動された(Moved)
Q ジョブは実行待ち状態(Queued)
R ジョブは実行中(Running)
S ジョブは実行停止中(Suspended)
T ジョブは新たな位置に移動された
U Cycle-harvesting job is suspended due to keyboard activity.
W ジョブ開始時刻待ち(Waiting)
X サブジョブが実行完了した、または削除された
Queue
ジョブ投入先キュー

なおジョブ履歴を残す設定をしていない場合、完了したジョブの問い合わせを行うとエラーが発生するよう。

$ qstat 12345
qstat: Unknown Job Id 12345.server
【例】workqにsubmitされたジョブがどのサーバで実行中であるか確認する
$ qstat -f workq | grep exec_host
    exec_host = server11/0
    exec_host = server11/2
    exec_host = server11/3
    exec_host = server11/4
    exec_host = server11/13
    exec_host = server11/15
    exec_host = server11/21

ジョブ状態の詳細表示

【書式】
qstat -f オプション ジョブIDまたは表示対象

【出力例】
Job Id: 225402.server
    Job_Name = myjob
    Job_Owner = user@server.mydomain.org
    resources_used.cpupercent = 89
    resources_used.cput = 40:36:51
    resources_used.mem = 15576kb
    resources_used.ncpus = 1
    resources_used.vmem = 304208kb
    resources_used.walltime = 47:22:11
    job_state = R
    queue = workq
    server = server
    Checkpoint = u
    ctime = Sat Sep 20 12:01:21 2014
    Error_Path = server.mydomain.org:/home/user/work/myjob.e225402
    exec_host = execnode01
    exec_vnode = (execnode01:ncpus=1)
    Hold_Types = n
    Join_Path = oe
    Keep_Files = n
    Mail_Points = a
    mtime = Sat Sep 20 12:01:24 2014
    Output_Path = server.mydomain.org:/home/user/work/myjob.o225402
    Priority = 0
    qtime = Sat Sep 20 12:01:21 2014
    Rerunable = True
    Resource_List.ncpus = 1
    Resource_List.nodect = 1
    Resource_List.place = pack
    Resource_List.Qlist = workq
    Resource_List.select = 1:ncpus=1:Qlist=workq
    stime = Sat Sep 20 12:01:24 2014
    session_id = 7191
    jobdir = /home/user
    substate = 42
    Variable_List = PBS_O_HOME=/home/user,PBS_O_LOGNAME=user,
	PBS_O_PATH=/usr/local/bin:/bin:/usr/bin,PBS_O_MAIL=/var/mail/user,
	PBS_O_SHELL=/bin/bash,PBS_O_HOST=server.mydomain.org,
	PBS_O_WORKDIR=/home/user/work,PBS_O_SYSTEM=Linux,
	param=1234,scname=myjob.sh,op=verbose,PBS_O_QUEUE=workq
    comment = Job run at Sat Sep 20 at 12:01 on (execnode01:ncpus=1)
    etime = Sat Sep 20 12:01:21 2014
    Submit_arguments = -v param=1234,scname=myjob.sh,
	op=verbose /home/user/work/myjob_sub.sh

各ジョブがどの実行ノードで実行されているのかを確認する際、この出力にフィルタをかければ見やすい。

【例】
$ qstat -f | egrep '^(Job Id|.*exec_)'
Job Id: 225398.server
    exec_host = execnode01/0
    exec_vnode = (execnode01:ncpus=1)
Job Id: 225400.server
    exec_host = execnode02/2
    exec_vnode = (execnode02:ncpus=1)
Job Id: 225401.server
    exec_host = execnode03/3
    exec_vnode = (execnode03:ncpus=1)
Job Id: 225402.server
    exec_host = execnode04/4
    exec_vnode = (execnode04:ncpus=1)

ジョブ状態の別形式表示

【書式】ジョブの状態表示
qstat オプション ジョブIDまたは表示対象
【出力】
                                             Req’d  Req’d   Elap
Job ID Username Queue Jobname SessID NDS TSK Memory Time  S Time
------ -------- ----- ------- ------ --- --- ------ ----- - ----
...
Job ID
ジョブ投入時に割り振られるジョブID
Username
ジョブを投入したジョブ所有者のユーザ名
Queue
ジョブ投入先キュー名
Jobname
ジョブ投入時に指定されたジョブ名
SessID
セッションID。ジョブが実行中である時のみ表示される。
NDS
ジョブ実行に割り当てられたノード数
TSK
ジョブ実行に割り当てられたCPU数
Req’d Memory
ジョブに割り当てるメモリ量表示。
Req’d Time
ジョブに割り当てるCPU時間またはウォールタイムを表示。どちらを表示するかはジョブ投入時の指示による。
S
ジョブの状態
Elap Time
ジョブが使ったCPU時間またはウォールタイムを表示。どちらを表示するかはジョブ投入時の指示による。
【書式】バージョン表示
qstat --version

ジョブに停止再開などの信号を送る(qsig)

qsigコマンドはジョブに信号を送る。シグナルはジョブのセッションリーダーに送られる。以下の場合、コマンドは拒否される。

【書式1】
qsig -s シグナル jobid
【書式2】バージョン情報を出力して終了する
qsig --version
-s シグナル
ジョブに送信するシグナルの種類を指定する。 シグナルの指定はシグナル名(例:SIGKILL)、SIGの接頭辞を省略したシグナル名(例:KILL)またはシグナル番号(無符号数、例:9)で行う。 指定がない場合の既定値は「SIGKILL」(KILL、9)。 「SIGNULL」(0)の指定も可能。この場合、ジョブに何の影響も与えない。 全てのシグナル名をqsigコマンドが認識する訳ではない。認識されない場合は代わりにシグナル番号を利用して下さい。 また「suspend」と「resume」(いずれも全て小文字)を指定することもできる。この場合、それぞれジョブの一時停止と再開を指示することができる。一時停止した場合、ジョブはシステムリソースを保持し続けるが、実行はされずwalltimeも加算されない。 「suspend」と「resume」を実行するには管理者あるいは操作権限のあるユーザである必要がある。 qsig -s resumeqsig -s suspendで一時停止されたジョブの実行再開に用いる。十分なリソースがあれば実行が再開される。
jobid
ジョブid。空白区切りで複数指定可能。

ジョブの削除(qdel)

qdel job id job id...

キューの管理

qmgrコマンドでキューの管理ができる。引数なしで実行すると対話モードでqmgr用サブコマンドが実行できる。qmgr -c サブコマンドで直接サブコマンドを実行することもできる。サブコマンドについて以下に記す。

help サブコマンド
引数なしで実行すると全般的なヘルプを表示する。引数としてコマンド名を指定すると指定したコマンドのヘルプが表示される。コマンドに指定できる値は以下のいずれか。
  • active
  • create …新たなノードまたはキューを作る
  • delete …既存のノードまたはキューを削除する
  • set …属性値の設定・変更を行う
  • unset …属性値の削除を行う
  • list
  • print …情報の表示を行う
  • quit …qmgrを終了する(exitも同じ)
active オブジェクト 名称
指定したオブジェクトを有効にする。オブジェクトに指定できるのは「server」「queue」「node」のいずれか。
【例】server1上のbatchキューおよびserver2、server3上のq1キューの
   max_running 属性に 10 を設定する。
$ qmgr
Max open servers: 49
Qmgr: active queue q1,batch@server1
Qmgr: active server server2,server3
Qmgr: set queue max_running = 10
print オブジェクト 名称
指定したオブジェクトの情報を表示する。出力内容はqmgrコマンドの入力に使うことができる。オブジェクトに指定できるのは「server」「queue」「node」のいずれか。「server」を指定すると、指定したサーバに関係する全てのキューとノードがサーバ自身の情報と合わせて表示される。名称はコンマ区切りで複数列挙できる(空白を挟んではいけない)。
【例】
$ qmgr
Max open servers: 49
Qmgr: print server
Qmgr: print node n1
set node n1 state = free ←ジョブ実行中なら「job-busy」となる
set node n1 resources_available.arch = linux
set node n1 resources_available.host = n1
set node n1 resources_available.mem = 132094400kb
set node n1 resources_available.ncpus = 32
set node n1 resources_available.vnode = n1
set node n1 queue = workq
set node n1 resv_enable = True
set node n1 sharing = default_shared
Qmgr: print queue workq
#
# Create queues and set their attributes.
#
#
# Create and define queue workq
#
create queue workq
set queue workq queue_type = Execution
set queue workq enabled = True
set queue workq started = True
create オブジェクト 名称
指定した名前で、指定したオブジェクトをサーバ上に作成する。オブジェクトに指定できるのは「queue」「node」のいずれか。名称はコンマ区切りで複数列挙できる(空白を挟んではいけない)。
【例】
$ qmgr
Max open servers: 49
Qmgr: create queue workq
list オブジェクト 名称
指定したオブジェクトの属性全てを出力する。オブジェクトに指定できるのは「server」「queue」「node」のいずれか。名称はコンマ区切りで複数列挙できる(空白を挟んではいけない)。オブジェクトとして「server」を指定し名前を指定しなかった場合は、全てのサーバが出力される。
【例】
$ qmgr
Max open servers: 49
Qmgr: list server
Server pbsserver
	server_state = Active
	server_host = pbsserver
	scheduling = True
	total_jobs = 0
	state_count = Transit:0 Queued:0 Held:0 Waiting:0 Running:0 Exiting:0 Begun:0 
	default_queue = workq
	log_events = 511
	mail_from = adm
	query_other_jobs = True
	resources_default.ncpus = 1
	default_chunk.ncpus = 1
	resources_assigned.ncpus = 0
	resources_assigned.nodect = 0
	scheduler_iteration = 600
	flatuid = True
	FLicenses = 144
	resv_enable = True
	node_fail_requeue = 310
	max_array_size = 10000
	pbs_license_file_location = /opt/pbs/10.1.0.91350/altair/security/altair_lic.dat
	pbs_license_min = 0
	pbs_license_max = 2147483647
	pbs_license_linger_time = 3600
	license_count = Avail_Global:143 Avail_Local:1 Used:0 High_Use:144
	pbs_version = PBSPro_10.1.0.91350
	eligible_time_enable = False
Qmgr: list queue workq
Queue workq
	queue_type = Execution
	total_jobs = 0
	state_count = Transit:0 Queued:0 Held:0 Waiting:0 Running:0 Exiting:0 Begun:0 
	resources_max.Qlist = workq
	resources_min.Qlist = workq
	resources_default.Qlist = workq
	default_chunk.Qlist = workq
	resources_assigned.ncpus = 0
	resources_assigned.nodect = 0
	enabled = True
	started = True
Qmgr: list nodes pbsnode01
Node pbsnode01
	Mom = pbsnode01
	Port = 15002
	pbs_version = PBSPro_10.1.0.91350
	ntype = PBS
	state = free
	pcpus = 8
	resources_available.arch = linux
	resources_available.host = pbsnode01
	resources_available.mem = 16507764kb
	resources_available.ncpus = 8
	resources_available.Qlist = workq,workq_intel
	resources_available.vnode = pbsnode01
	resources_assigned.mem = 0kb
	resources_assigned.ncpus = 0
	resources_assigned.vmem = 0kb
	comment = node down: communication closed
	resv_enable = True
	sharing = default_shared
delete オブジェクト 名称
指定したオブジェクトをPBSサーバから削除する。オブジェクトとして指定できる値は「queue」「node」。

ノードを複数のキューに関連づける

参考:PBS Professional 10.0 Administrator's Guide(日本語版)

RHEL 5.5 で標準的な設定でインストールした場合、$PBS_HOME/var/spool/PBS

3つのキュー dogQ、catQ、ratQ と、4つのvnode vn[1]、vn[2]、vn[3]、vn[4] があり、以下の通り対応させる場合。

言い換えると

1. $PBS_HOME/server_priv/resourcedefに追記
Qlist type=string_array flag=h
2. $PBS_HOME/sched_priv/sched_configにQlistを追記
resources: "ncpus, mem, arch, host, vnode, Qlist"
3. キューをvnodeマッピングに追加
# qmgr
Qmgr: set node vn[1] resources_available.Qlist="dogQ,ratQ"
Qmgr: set node vn[2] resources_available.Qlist="dogQ,catQ,ratQ"
Qmgr: set node vn[3] resources_available.Qlist="catQ,ratQ"
Qmgr: set node vn[4] resources_available.Qlist="catQ"
4. ジョブに正しいQ値の要求を強制する
# qmgr
Qmgr: set queue dogQ resources_default.Qlist=dogQ
Qmgr: set queue dogQ resources_min.Qlist=dogQ
Qmgr: set queue dogQ resources_max.Qlist=dogQ
Qmgr: set queue dogQ default_chunk.Qlist=dogQ
Qmgr: set queue catQ resources_default.Qlist=catQ
Qmgr: set queue catQ resources_min.Qlist=catQ
Qmgr: set queue catQ resources_max.Qlist=catQ
Qmgr: set queue catQ default_chunk.Qlist=catQ
Qmgr: set queue ratQ resources_default.Qlist=ratQ
Qmgr: set queue ratQ resources_min.Qlist=ratQ
Qmgr: set queue ratQ resources_max.Qlist=ratQ
Qmgr: set queue ratQ default_chunk.Qlist=ratQ

ジョブ実行ノードの管理(pbsnodes)

pbsnodesはPBSジョブ実行ノードの状態表示、特定ノードのonline/offlineなどの制御を行う。

【書式1】ホストのonline/offline制御
pbsnodes [ -c | -o | -r ] [-s server] hostname [hostname ...]
【書式2】offlineになっているホストを表示
pbsnodes [-l] [-s server]
【書式3】ホストの状態を表示
pbsnodes -a [-v] [-s server]
【書式4】バージョンを表示して終了
pbsnodes --version
-a
全ホストの全属性情報を表示する。
-l
offlineになっているか、あるいはダウンしているホストを表示する。
-o ホストリスト
指定したホストをPBS実行ノードから切り離す(offline)。この実行には管理者権限が必要。
-c ホストリスト
指定したホストをPBS実行ノードに加える(connect)。この実行には管理者権限が必要。

システムファイル、ログなどの場所

デフォルトのrootパス
/opt/pbs/default

トラブルシューティング

その他

コマンドの別名登録(alias)

参考サイト:

バージョン情報(var)

[HOST]$ view /etc/issue
    

テキスト中にバージョン情報が記載されている。

参考サイト:南アラバ公国: RedHat Linuxのバージョン確認

ファイルの改竄チェック

MD5チェックサム(md5sum)

md5sum コマンドは指定ファイルのMD5チェックサム計算結果を出力する。

【書式】
md5sum ファイル名

【例】
$ md5sum mysql-standard-5.0.46-linux-i686.tar.gz
aaab65abbec64d5e907dcd41b8699945 mysql-standard-5.0.46-linux-i686.tar.gz
      

(g)awkifなどを併用すればMD5計算結果が合っているか確認しやすい。

【書式】
$ if [ "`md5sum ファイル名 | awk '{print $1}'`" = "MD5計算結果" ];then echo "OK";else echo "NG";fi

【例】
$ if [ "`md5sum somebin | awk '{print $1}'`" = "fb727a3ac72bf0ce37e1a20468a7bb812" ];then echo "OK";else echo "NG";fi
OK
      

よく使うならパスの通ったディレクトリにスクリプトを用意しておく方が便利かと思われる。

【例】/usr/local/bin/check_md5sum を置く
$ cat check_md5sum
#!/bin/sh
if [ "`md5sum $1 | awk '{print $1}'`" = "$2" ];then
  echo "OK";
else
  echo "NG";
fi
$ check_md5sum somebin fb727a3ac72bf0ce37e1a20468a7bb812
OK
      
shell> sha1sum ファイル名 > 結果ファイル名 ←チェックサム計算結果が結果ファイル出力される
shell> sha1sum --check 署名ファイル名 ←正しいかどうかの結果が返る?
shell> sha1sum ファイル名  ←チェックサム値とファイル名が出力される。
      

sha1

openssl sha1 filenamefilename に指定したファイルのチェックサムを出力します(SHA-1)。
openssl/usr/bin/にあります。パスが通っていない場合、フルパスをつけて/usr/bin/opensslと指定する必要があります。
※結果はsha1 ([ファイルのフルパス名]) = [チェックサム]の形式で出力されます。

例:
shell> openssl sha1 ~/downloads/foo.dmg
SHA1 (/Users/kudoutakahiro/downloads/foo.dmg=2eb722f340d4e57aa79bb5422b94d556888cbf38)
      

コマンド出力結果の制御

コマンド出力結果を捨てる
/dev/nullを使う。入力として使う場合はファイル終了(eof)と同じように動作する。
/dev/nullを使う。
エラー結果をファイルに出力する
例:正規出力は画面に、エラー出力はerrfileへ出力する。
cat somefile nofile 2> errfile
例:正規出力はoutfileに、エラー出力はerrfileへ出力する。
cat somefile nofile >outfile 2> errfile
これも同じ。
cat somefile nofile 1>outfile 2> errfile
例:正規出力、エラー出力ともcompositeへ出力する。
cat somefile nofile 1> composite 2>&1
例:エラーメッセージは捨てる。
cat somefile nofile > outfile 2> /dev/null
ファイルと標準出力(画面)の両方に出力する
例:ファイル一覧情報を画面とファイルdircontsの両方に出力する。
ls -l | tee dirconts

コマンド実行履歴

historyコマンドは、コマンドの実行履歴を表示する。

各履歴の行頭に記された番号を指定して同じコマンドを再実行することができる。

$ history
 1 ls
 2 ls -l
 3 exit
 4 history
$ !1 # 1番の"ls"を実行
    

その他オプションなどを以下に記す。

【書式1】
history 行数
【書式2】
【書式3】
【書式4】
【書式5】
【書式6】
行数
整数値を指定。指定を行った場合、新しい方から行数件だけ履歴を表示する。指定を省略した場合は、保存された全ての履歴を表示。

環境変数 HISTTIMEFORMAT の設定により、コマンド実行時刻も記録することができる。

[~/.bashrc] 以下の1行を任意の場所に追記
export HISTTIMEFORMAT='%Y-%m-%d %T '
    

なお、zsh では上記設定を行わなくても?(~/.zshrc に「setopt extendedhistory」を追記しておく必要あり?)、history -i で時刻まで表示できるよう。

参考文献・サイト

ホーム内ディレクトリの言語設定

ホームディレクトリ配下の「デスクトップ」「ドキュメント」などのディレクトリを操作する際、CUIだとフォルダ名を入力する手間がかかる。ディレクトリ名を英語に変更し、この手間がかからないようにするには端末上で「LANG=C xdg-user-dirs-gtk-update」を実行すればよいとのこと[1]

環境変数関係

環境変数一覧表示(printenv)

printenvを実行すれば、環境変数が一通り表示される。

参考サイト:環境変数の一覧を表示するには(@IT Linux Square)

環境変数の設定(bash)

環境変数の値を常時変更するには ~/.bashrc に下記の通り追記。なお 似たファイルに ~/.bash_profile があるが、こちらはログイン時にだけ実行される設定ファイル。~/.bashrc は別のシェルが起動した時にも実行される。

【例】$PATH に /usr/local/mysql を追加する
PATH=$PATH:/usr/local/mysql

export PATH
    

環境変数の値を一時的に変更するには exportコマンドを用いる。

shell> export PATH=$PATH:/usr/local/mysql
    

.bashrcファイル内でのコメントアウトは #(これ以降行末までがコメントアウトされる)。

環境変数の削除はunset 変数名

ユーザに依存しないシステム汎用の環境変数や起動プログラムの設定は /etc/profile に、ログイン時の機能設定やエイリアスの設定は /etc/bashrc に記述されたスクリプトで行われる。

システム情報

OSのバージョン

RHELやCentOSの場合、/etc/redhat-releaseというテキストファイルに記載されている。

【例】
shell> cat /etc/redhat-release
Red Hat Enterprise Linux Server release 5.4 (Tikanga)
      

ハードウェア情報

dmidecodeコマンドで、BIOS、製品、マザーボード、CPU、キャッシュなどの情報が参照できる。

【例】
shell> dmidecode
# dmidecode 2.10
SMBIOS 2.6 present.
103 structures occupying 6699 bytes.
Table at 0xDF79C000.

Handle 0xDA00, DMI type 218, 11 bytes
OEM-specific Type
        Header and Data:
                DA 0B 00 DA B0 00 17 00 0E 20 00

Handle 0x0000, DMI type 0, 24 bytes
BIOS Information
        Vendor: Dell Inc.
        Version: 1.1.9
        Release Date: 05/21/2010
        Address: 0xF0000
        Runtime Size: 64 kB
        ROM Size: 4096 kB
        Characteristics:
                ISA is supported
                PCI is supported
                PNP is supported
                BIOS is upgradeable
...
      

メモリ情報

/proc/meminfoのファイル内容を参照すれば、物理メモリ量などが分かる。

【例】
shell> less /proc/meminfo
MemTotal:     132094400 kB
MemFree:      122615632 kB
Buffers:        404232 kB
Cached:        8413392 kB
SwapCached:          0 kB
Active:        1271848 kB
Inactive:      7682700 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:     132094400 kB
LowFree:      122615632 kB
SwapTotal:    33551744 kB
SwapFree:     33551744 kB
Dirty:              48 kB
Writeback:           0 kB
AnonPages:      136828 kB
Mapped:          41872 kB
Slab:           451792 kB
PageTables:       8064 kB
NFS_Unstable:        0 kB
Bounce:              0 kB
CommitLimit:  99598944 kB
Committed_AS:   721632 kB
...
      

システム情報

unameコマンドでシステム情報を得ることができる。

【書式】
uname オプション
-m
--machine
マシン (ハードウェア) のタイプを表示する。
# uname -m
i686
-n
--nodename
マシンのネットワークノードのホスト名を表示する。hostnameコマンドの出力結果と同じ。
# uname -n
hoge.sample.org
-r
--release
OS のリリースを表示する
# uname -r
2.6.18-164.15.1.el5
-s
--sysname
OS の名称を表示する
# uname -s
Linux
-a
--all
上記オプションの情報を全て表示する。
# uname -a
Linux hoge.sample.org 2.6.18-164.15.1.el5 #1 SMP Mon Mar 1 10:56:08 EST 2010 x86_64 x86_64 x86_64 GNU/Linux

パスを確認と追加

現在のパス表示。

echo $PATH

パスの追加。

export PATH=$PATH:[追加ディレクトリ名]

この方法だと、一旦ログアウトすれば設定は元に戻ってしまう。常時設定を行うにはユーザプロファイルを編集する→こちら

例えば、ホームディレクトリ下のbinディレクトリを追加するには、

export PATH=$PATH:$HOME/bin

プロンプトの設定

bashの場合、PS1 という環境変数にプロンプトの表示内容が設定されている。

参考文献・サイト

アプリケーション関係

chemtoolのインストール

chemtoolをインストールする前に、いろんなものの事前インストールがいるみたい。 GTK+, glib, pangoがいり、更にglibのインストールにはpkgconfig, libiconv, gettextがいる。 この中で、pangoのインストールがうまく行かない。./configure の段階でエラーになる。

checking for FONTCONFIG... Package fontconfig was not found in the pkg-config search path.
Perhaps you should add the directory containing `fontconfig.pc'
to the PKG_CONFIG_PATH environment variable
No package 'fontconfig' found
configure: WARNING: No fontconfig found, skipping tests for FreeType and Xft
checking for CAIRO... Package cairo was not found in the pkg-config search path.
Perhaps you should add the directory containing `cairo.pc'
to the PKG_CONFIG_PATH environment variable
No package 'cairo' found
configure: error: *** Didn't find any of FreeType, X11, or Win32.
*** Must have at least one backend to build Pango.
    

MacPortのインストール

Macの手書き説明書 | MacPorts

Rasmolのインストール

  1. ソースコードをダウンロード
    ※最初バイナリを入手したが、X11が起動するだけでRasMolが起動してこないので、ソースからのインストールに挑戦。
  2. 解凍→ダブルクリックで解凍できた。解凍したものは/User/kudoutakahiro/downloads/RasMol_2.7.3 以下
  3. cd src
  4. cp Makefile.in Makefile
  5. Makefileを編集
    CC=gcc → CC=cc
    既定値は8ビットUNIXワークステーション用。ネイティブCコンパイラを使うには上記修正を行う。但し、次のCFLAGS行も環境に応じて修正が必要とのこと。どう修正したらいいか分からない。とりあえずそのままにしておく。
  6. rasmol.h ファイルを編集
    #define行を編集とあるが、どう編集したらいいのか分からない。
    コメントアウト行?(#で始まる行)に"/* #define APPLEMAC */"というのがあるので、これを復活されればいいのか?
    でも既に"#define X11WIN","#define UNIX"があるので動くのかな? X11上で動くなら。
  7. make
    何かエラー出まくってmakeが終了している。そんなディレクトリはねぇ、データ定義に型がないかまたはストレージクラス、などのエラー。やはりCFLAGS行そのままではだめか…。

インストール時などのアクセス拒否エラー

アプリケーションのインストール(make install)やチェック(make check)時に "cannot restore segment prot after reloc: Permission denied" というエラーは、「SELinuxがセキュリティーの問題でライブラリをロード出来ないようにしてあるために起こる」とのこと。エラーメッセージで表示されているファイルに対して以下のコマンドを実行すれば回避できる。

chcon -t textrel_shlib_t '該当ファイル'
    

参考サイト:cannot restore segment prot after reloc: Permission denied - Linuxシステム設定

Picasaのフォント設定

Picasa3.0(Googleの画像共有サイトと連携できる画像管理ソフト)をUbuntu 10.04にインストールしたが、画像やフォルダ名にマルチバイト文字があると文字化けしてしまう。その対策方法について、下記サイトに対処法が記載されてあったが、多少パスなどが変わっていたので、メモ。

1. UbuntuのフォントがPicasaでも利用できるようにする
sudo ln -s /usr/share/fonts/truetype/ttf-ipamonafont/ipagui-mona.ttf /opt/google/picasa/3.0/wine/drive_c/windows/fonts/
2. 追加可能なフォントリストに追加
gedit ~/.google/picasa/3.0/system.reg"IPAGUI Gothic"="Z:\\usr\\share\\fonts\\truetype\\ttf-ipamonafont\\ipagui-mona.ttf"
3. [Picasa Font Settings]で追加
[グラフィックス]-[Picasa]-[Picasa Font Settings]の「Font Linking」タブ内の「Linked Fonts」右の「Add」で「IPAGUI Gothic」を追加。

参考サイト:1 Entry per Day: Picasaで文字化け[Ubuntu8.10]

Javaのインストール

Java環境として類似のOpenJDKがあるが、これだとうまくJava Appletが動かないよう。

[centos6]
# ls ~jre-6u26-linux-i586.bin
# cd /usr/lib/jvm
# chmod +x ~jre-6u26-linux-i586.bin
# ~jre-6u26-linux-i586.bin
# which java
/usr/bin/java
# ls -l /usr/bin/java
lrwxrwxrwx. 1 root root 22  8月 22 17:26 2011 /usr/bin/java -> /etc/alternatives/java
# ls -l /etc/alternatives/java
lrwxrwxrwx. 1 root root 35  8月 22 17:26 2011 /etc/alternatives/java -> /usr/lib/jvm/jre-1.5.0-gcj/bin/java
# ls /usr/lib/jvm
java-1.5.0-gcj-1.5.0.0  jre  jre-1.5.0  jre-1.5.0-gcj  jre-gcj  jre1.6.0_26
# ln -sf /usr/lib/jvm/jre1.6.0_26/bin/java /etc/alternatives/java
# ls -l /etc/alternatives/java
lrwxrwxrwx. 1 root root 33  8月 22 17:34 2011 /etc/alternatives/java -> /usr/lib/jvm/jre1.6.0_26/bin/java

ビットマップ(ラスターイメージ)編集ソフト

GIMPでCMYK形式に対応するには、Separate+ プラグインを導入すればいいらしい[1]

参考文献・サイト

  1. GIMPでCMYKをサポートする - 漫画の描き方研究ラボ

SVG(ベクターイメージ)編集ソフト

LinuxではXara Xtremeが良さそう。Windowsの有償製品をLinux向けにオープンソース化したもので、機能が充実していて使いやすいと評されている。Illustrator形式のファイル(拡張子は「.ai」)も開いて編集可能。但し、フォント名にマルチバイト文字列を含んでいなくてかつ、日本語が扱えるフォントをシステムにインストールしておかないと、日本語等の入力ができない。その要件を満たすフォントとして、IPAフォントとM+フォントを組み合わせたMigMixなどがある[1]

参考文献・サイト

  1. 高機能なベクター画像エディタ Xara Xtreme - 特選フリーソフト:ITpro

autoconf(インストールスクリプト)関係

参考文献・サイト

  1. 初心者への GNU autoconf のススメ

デバイス関係

物理メモリ量確認(free)

shell> free
             total       used       free     shared    buffers     cached
Mem:       1286436    1260376      26060        632      55556     937940
-/+ buffers/cache:     266880    1019556
Swap:      2040244      83244    1957000
この場合、物理メモリ量は1286436Byte。
    

参考文献・サイト:

プリンタの設定

以下にネットワークプリンタ(プリンタ自身がIPアドレスを持ち、共有プリンタとして機能しているプリンタ)の設定について記す。

機種名 URL 備考
EPSON EP-805A socket://[IPアドレス]:9100 Ubuntu 12.04 Server 64bit版にて確認
Canon PIXMA MP980 bjnp://[IPアドレス]:8611 Ubuntu 12.04 Server 64bit版にて確認