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