argius note

プログラミング関連

xargs + cygstart

"Numeric"という単語を含むファイルを検索し、最大10件まで自動でファイルを開くようにしたい。以下のようにコマンドを実行してみる。

find . -name "*Numeric*" | head -n 10 | xargs cygstart

特に問題がないように思えるが、上手くいかない。
これは、xargsは通常、引数の最大サイズ(バイト数)を超えるまで1プロセスに引数を渡してしまうためで、検索結果が最大を越えない限り、1ファイルしか開かれない。
見つかったファイルをすべて開く場合は、次のようにすれば良い。

find . -name "*Numeric*" | head -n 10 | xargs -n 1 cygstart

"-n"オプションで、いくつの引数ごとにプロセスを起動するかを決めることができる。例えば、

$ ls
AA1.sh
AA3.sh
ABC.sh
ADD.sh
$ find . -name "A*" | xargs -n 2 cygstart
→ cygstart AA1.sh AA3.sh
   cygstart ABC.sh ADD.sh

おまけ:引数の最大サイズを知るには、以下のコマンドを実行する。

$ grep -nr ARG_MAX /usr/include/
/usr/include/glob.h:93:
#define  GLOB_LIMIT      0x1000  /* Limit memory used by matches to ARG_MAX */
/usr/include/limits.h:170:
#define       _POSIX_ARG_MAX          4096
/usr/include/sys/syslimits.h:40:
#define ARG_MAX                 65536   /* max bytes for an exec function */
/usr/include/sys/unistd.h:239:
#define _SC_ARG_MAX                 0