UNIXの小技
UNIXコマンドの小技
目次
リモートファイルをディレクトリごとコピーする
- scp コマンドに -r オプションを付けます。
同時に -p オプションも付けるとなお便利でしょう。
scp -pr remotehost:dir dir
- rsync を使います。セキュリティ上、-e オプションで ssh を指定しておきましょう。
(あるいは環境変数で指定)
rsync -e ssh -avz remotehost:dir dir
以上の2方法は、稀にエラーを起こすことがあります。 (特に ssh2 系 - ssh1 系のホスト間でよくエラーが起きるような気がします) このような場合、tar でディレクトリのアーカイブを作り、*.tar (*.tgz) ファイルを転送すれば確実です。
tar cvf dir.tar dir/
アーカイブの出力をそのまま標準出力に吐き出して、パイプで手元の tar にデータを渡し、 そのまま解凍することもできます。
ssh remotehost tar cvf - dir/ | tar xvf -
数字順のファイル名の処理
csh 系の場合
注:これはシェルに tcsh を使っている場合の小技です。
1, 2, 10, 11... のようなファイルを順番に処理したいとき、ワイルドカードで
foreach f ( * ){
とすると、1,10,11,2 ... の順に実行されてしまう。 桁毎に
foreach f ( ? ?? ??? ){ echo "$f" # (←ここでデータを処理) }
のようにすれば対処できる。
- このシェルスクリプトは echo "$f" # (←ここでデータを処理)と書く習慣をつけたほうがいいです.iTunes インストーラのハードディスク全消し事件の教訓です.
- http://www.tidbits.com/tb-issues/lang/jp/TidBITS-jp-605.html#lnk2 ですね
- ありがとうございます。$f → "$f" に修正しました。
- http://www.tidbits.com/tb-issues/lang/jp/TidBITS-jp-605.html#lnk2 ですね
sh 系の場合
bash 等 sh 系なら以下のようにします。
for name in ? ??; do echo "$name" # ここでデータを処理 done
数の最大値が不明なら、以下のようにします。
name=1 while [ -f "$name" ]; do echo "$name" # ここでデータを処理 name=`expr "$name" + 1` done
初期値が 1 じゃないときは先頭行の 1 を適当な数値に置き換えましょう。
shellscriptをGUIで(ターミナル.app)で実行する
実行可能なShellScriptの拡張子を.commandにすればターミナル.appに関連づけされ、クリックでターミナル.app上で実行可能です。ただし、shellscriptの終了時に終了したターミナル.appが残ります。
メモリヒープの確保
大きな配列を扱うと、プログラム実行時に Segmentation fault というエラーを出して終了することがある。 本来は malloc() calloc() 等でヒープ領域を確保して使う方が望ましいが、暫定的に以下の解決法がある。
- tcshの場合、limit コマンドで stacksize の上限を変更して対処する
% limit stacksize unlimited
- bashの場合は、次のようにする
$ ulimit -s unlimited
Snow Leopard では ulimit でスタックサイズを変更できないようになっている。 -Wl,-stack_size,0×40000000 のような引数をコンパイラに渡して対処できる。
Intel Fortran では -heap-arrays オプションを使うことができる。
その他
- バイナリ形式の扱い
double buf; fread( &buf, sizeof(double), 1, stdin ); // stdio cin.read( (char *) &buf,sizeof(double) ); // iostream
- Mac OS X を含む UNIX 系 OS では、fopen() などの関数でモードとして `b' を指定しても動作は変わらず、単に無視される。
- Fortranのunformattedバイナリデータ
- "record marker" という整数データが付加される。
- write(1) i,j のとき、 ( i と j のバイト数の和 ) ( i の内容 ) ( j の内容 ) ( i と j のバイト数の和 )
- ref: http://denki.nara-edu.ac.jp/~yabu/soft/fortran.html
- 64ビットコンパイラでは 8 ビット整数が使われることがある。
- gfortran では -frecord-marker=[4,8] オプションでコントロール可能
- ref. Fortran 覚書
- Makefileの高度な書き方
- データファイルを最後の行から順番に表示する
- Linuxには tac というコマンドが入っている