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 の 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
なるほど。
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
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 コマンドで表示されるタイムスタンプ書式は 環境変数 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
これで好きな書式で表示できます。