UNIXの小技

提供: MacWiki
移動: 案内検索

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 インストーラのハードディスク全消し事件の教訓です.

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. gfortran manual
    • ref. Fortran 覚書
    • ifort は form='binary' オプションで record marker なしのバイナリ入出力に対応。非標準機能なので gfortran は未対応でした。
  • データファイルを最後の行から順番に表示する
    • Linuxには tac というコマンドが入っている

Wiki内の関連ページ[編集]