
次のファイルを検討してください。
$ find findtest
findtest
findtest/test1
findtest/test1/start.ksh
findtest/test2
findtest/test2/start.ksh
findtest/test3
findtest/test3/start.ksh
findtest/test4
findtest/test4/start.ksh
{}
私の質問は、呼び出しでのの使用についてです-exec
。結果ファイルを指定するときに期待どおりに動作します。
$ find findtest -name test[1-4] -exec ls -d {} \;
findtest/test1
findtest/test2
findtest/test3
findtest/test4
ただし、パス内で使用すると展開されないようです。
$ find findtest -name test[1-4] -exec md5sum {}/start.ksh \;
md5sum: {}/start.ksh: No such file or directory
md5sum: {}/start.ksh: No such file or directory
md5sum: {}/start.ksh: No such file or directory
md5sum: {}/start.ksh: No such file or directory
下位階層のファイルにアクセスするにはどうすればよいでしょうかfind -type d -exec
? このようなループを使用できることはわかっていますが、1 回の呼び出しfor
で実行できるかどうか知りたいです。find
$ for f in $(find findtest -name test[1-4]); do md5sum "$f"/start.ksh; done
d41d8cd98f00b204e9800998ecf8427e findtest/test1/start.ksh
d41d8cd98f00b204e9800998ecf8427e findtest/test2/start.ksh
d41d8cd98f00b204e9800998ecf8427e findtest/test3/start.ksh
d41d8cd98f00b204e9800998ecf8427e findtest/test4/start.ksh
答え1
のfind コマンドの POSIX 標準分離された {} のみがファイル名に置き換えられ、最初のものだけが置き換えられます。 を使用すると、{}/start.ksh
未指定の動作が発生します。
2 つの文字 "{}" のみを含む引数は、集約されたパス名のセットに置き換えられ、各パス名は、集約されたのと同じ順序で、呼び出されたユーティリティに個別の引数として渡されます。2 つ以上のパス名のセットのサイズは、ユーティリティの実行によってシステムの {ARG_MAX} 制限を超えないように制限されます。2 つの文字 "{}" のみを含む引数が複数存在する場合、動作は未指定です。
utility_name または引数文字列に 2 つの文字 "{}" が含まれているが、2 つの文字 "{}" だけが含まれていない場合、find がそれらの 2 つの文字を置き換えるか、文字列を変更せずに使用するかは実装によって定義されます。
Solaris find を使用して必要な操作を実行する 1 つの方法は、次のコマンドです。
find findtest -name "test[1-4]" -exec sh -c 'md5sum $1/start.ksh' foo {} \;
より速い方法は次のとおりです。
find findtest -name "test[1-4]" -exec sh -c 'for i; do md5sum "$i/start.ksh"; done' foo {} +
答え2
- 実際には、シェルは
test[1-4]
を呼び出す前に展開されますfind
。次のようにエスケープする必要があります。'…'
{}
別個のトークンである場合にのみパターンとして扱われる
-exec
+
それ自体は通常高価であり、トレーリングで使用するか、フィーディングを優先して使用することをお勧めしますxargs
。
このように for ループを使用できることはわかっていますが、1 回の find 呼び出しで実行できるかどうかを知りたいです。
find findtest -name 'test[1-4]' -print0 | xargs -0I{} -- md5sum '{}/start.ksh'
md5sum
— すべてのファイル名を一度に指定することで、効率的に実行されます。