bash の cd - と 環境変数 OLDPWD

bash では cd - とすることで 1つ前(cd する前)のディレクトリに移動することができます。

/var$ cd -
/tmp
/tmp$

この 1つ前のディレクトリのパスは 環境変数 OLDPWD に持っています。

1度も cd を使っていない場合 環境変数 OLDPWD は 空なので cd - しても ディレクトリを移動できません。

~$ bash
~$ cd -
bash: cd: OLDPWD not set

逆に 環境変数 OLDPWD に 値を設定すれば cd - で そのディレクトリに移動できます。

~$ export OLDPWD=/tmp
~$ cd -
/tmp
/tmp$

find コマンドの -exec オプションの + と ; について

find の man を見ていたら -exec について 以下のように書いてありました。

-exec command ;
-exec command {} +

プラス? と思いつつも英語を読まずに即検索。 書いてあるページがありました。

[参考]
Linux - find の -exec optionの末尾につく \; と + の違い。 - Qiita (2013/10/01)

$ find . -exec echo {} \;
./test1.txt
./test2.txt
./test3.txt
$ find . -exec echo {} +
./test1.txt ./test2.txt ./test3.txt

なるほど。

join コマンドでできることイロイロ

Linux には join という SQL使いにも馴染み易そうなコマンドがあります。

このコマンドは 2つのファイル(片方は標準入力可)の 指定したフィールドで結合した結果を返してくれます。

[text1.txt]

11111 aa1
22222 bb1
33333 cc1
55555 ee1
[text2.txt]

11111 aa2
33333 cc2
44444 dd2
66666 ff2

フィールドを指定しないと 1つ目のフィールドで結合します。

$ join test1.txt test2.txt

11111 aa1 aa2
33333 cc1 cc2

INNER JOIN ですね。
test1.txt と test2.txt の両方に存在する "11111" と "33333" が出力されました。

外部結合もできます。

$ join -a1 test1.txt test2.txt

11111 aa1 aa2
22222 bb1
33333 cc1 cc2
55555 ee1

LEFT JOIN になりました。
test1.txt からは全行が出力されています。

RIGHT JOIN もできます。

$ join -a2 test1.txt test2.txt

11111 aa1 aa2
33333 cc1 cc2
44444 dd2
66666 ff2

test2.txt の全行になりました。

"-a1" "-a2" を両方指定することもできます。

$ join -a1 -a2 test1.txt test2.txt

11111 aa1 aa2
22222 bb1
33333 cc1 cc2
44444 dd2
55555 ee1
66666 ff2

これで、どちらかのファイルに フィールドが存在する行が 出力されました。

cut コマンドなどで切り出せば 何かに使えそうですね。

$ join -a1 -a2 test1.txt test2.txt | cut -f1

11111
22222
33333
44444
55555
66666

フィールドがマッチしない場合に 出力することもできます。

$ join -v1 test1.txt test2.txt

22222 bb1
55555 ee1

test1.txt にのみフィールドが存在する行が 出力されました。

"-v1" と "-v2" を どちらも指定すると どちらかのファイルにのみフィールドが存在する行が出力されます。

$ join -v1 -v2 test1.txt test2.txt

22222 bb1
44444 dd2
55555 ee1
66666 ff2

指定したフィールドでの比較なので diff とはちょっと違いますね。

2つのファイルの差分なので 何かのチェックに使えそうです。

$ join -v1 -v2 test1.txt test2.txt | cut -f1

22222
44444
55555
66666

行番号を付ける nl コマンド

Linux には行番号を付ける nl というコマンドがあります。

行番号付けるだけではないのですが 深く掘り下げた使い方はしません。

[test.txt]

aaaaaaaaa
bbbbbbbbb
ccccccccc
ddddddddd
$ nl test.txt
     1  aaaaaaaaa
     2  bbbbbbbbb
     3  ccccccccc
     4  ddddddddd

こんな感じです。

これくらいなら cat でもできます。

$ cat -n test.txt
     1  aaaaaaaaa
     2  bbbbbbbbb
     3  ccccccccc
     4  ddddddddd

nl はオプションなしだと空行は番号を付けません。

$ nl test.txt
     1  aaaaaaaaa
     2  bbbbbbbbb
        
     3  ddddddddd
     4  eeeeeeeee

空行もにも番号を付ける場合はオプションを指定します。

$ nl -b a test.txt
     1  aaaaaaaaa
     2  bbbbbbbbb
     3
     4  ddddddddd
     5  eeeeeeeee

nl なら簡単に初期値を変えることもできます。

$ nl -v 3 test.txt
     3  aaaaaaaaa
     4  bbbbbbbbb
     5  ccccccccc
     6  ddddddddd

1行ごとの増加値も指定することができます。

$ nl -i 3 test.txt
     1  aaaaaaaaa
     4  bbbbbbbbb
     7  ccccccccc
    10  ddddddddd

awk などでもできなくはないですが 簡単なので覚えておくと便利です。

ls コマンドのタイムスタンプの書式

ls コマンドで表示されるタイムスタンプ書式は 環境変数 LANG によって変わります。

Ubuntu10.04 の ls だと次のようになります。

LAMG=C

$ env LANG=C ls -lt

-rw-r--r-- 1 root root  847 May 27 15:41 snmpd
-rw-r--r-- 1 root root  258 Nov 28  2013 samba
-rw-r--r-- 1 root root  876 Mar 17  2011 exim4
-rw-r--r-- 1 root root   64 Mar 17  2011 ntpdate

タイムスタンプが古い場合は 時刻ではなく、年が表示されます。

LANG=ja_JP.UTF-8

$ env LANG=ja_JP.UTF-8 ls -lt

-rw-r--r-- 1 root root  847 May 27 15:41 snmpd
-rw-r--r-- 1 root root  258 Nov 28  2013 samba
-rw-r--r-- 1 root root  876 Mar 17  2011 exim4
-rw-r--r-- 1 root root   64 Mar 17  2011 ntpdate

LAMG=C と同じですね。

LANG=en_US.UTF-8

$ env LANG=en_US.UTF-8 ls -lt

-rw-r--r-- 1 root root  847 2014-05-27 15:41 snmpd
-rw-r--r-- 1 root root  258 2013-11-28 17:56 samba
-rw-r--r-- 1 root root  876 2011-03-17 11:20 exim4
-rw-r--r-- 1 root root   64 2011-03-17 11:12 ntpdate

YYYY-MM-DD hh:mm になります。

指定したいときは "--time-style" オプションを使います。

$ ls -lt --time-style=+"%Y/%m/%d %H:%M:%S"

-rw-r--r-- 1 root root  847 2014/05/27 15:41:05 snmpd
-rw-r--r-- 1 root root  258 2013/11/28 17:56:50 samba
-rw-r--r-- 1 root root  876 2011/03/17 11:20:45 exim4
-rw-r--r-- 1 root root   64 2011/03/17 11:12:01 ntpdate

これで好きな書式で表示できます。

Google サイト内検索

Amazonアソシエイト