find
コマンドで見つかったパスでコマンドを実行し、+
を使用して、外部コマンドが起動される回数を減らしたい。
重要なことに、コマンドには固定値の最終引数があります。これは、実際にはecho
をコマンドとして使用した具体的な例です。
mkdir blah && cd blah
touch fooA
touch fooB
find . -name 'foo*' -exec echo {} second +
私はこれが印刷されることを期待します:
./fooA ./fooB second
しかし、代わりにエラーfind: missing argument to
- exec'. I've tried all sorts of permutations to get it to work with +. Why isn't this working? It works find with the
\; `バリアントが発生します:
find . -name 'foo*' -exec echo {} second \;
./fooB second
./fooA second
...しかし、それは私が求めているものではありません。
find --version
レポート:
find (GNU findutils) 4.4.2
Copyright (C) 2007 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Eric B. Decker, James Youngman, and Kevin Dalley.
Built using GNU gnulib version e5573b1bad88bfabcda181b9e0125fb0c52b7d3b
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION FTS() CBO(level=0)
+
および;
フォームをカバーするマニュアルページからの抜粋を次に示します。
-exec command ;
Execute command; true if 0 status is returned. All following arguments to find are taken to be arguments to the command until an argument consisting of `;' is encoun‐
tered. The string `{}' is replaced by the current file name being processed everywhere it occurs in the arguments to the command, not just in arguments where it is
alone, as in some versions of find. Both of these constructions might need to be escaped (with a `\') or quoted to protect them from expansion by the Shell. See the
EXAMPLES section for examples of the use of the -exec option. The specified command is run once for each matched file. The command is executed in the starting direc‐
tory. There are unavoidable security problems surrounding use of the -exec action; you should use the -execdir option instead.
-exec command {} +
This variant of the -exec action runs the specified command on the selected files, but the command line is built by appending each selected file name at the end; the
total number of invocations of the command will be much less than the number of matched files. The command line is built in much the same way that xargs builds its com‐
mand lines. Only one instance of `{}' is allowed within the command. The command is executed in the starting directory.
find | xargs
を使用した同様のソリューションは次のとおりです。
find . -name 'foo*' -print0 | xargs -0 -n1 -I{} echo {} second
find -exec +
またはfind | xargs
で解決策を見つけることができませんでしたが、 GNU Parallel で問題を解決できます。
mkdir blah && cd blah
touch fooA
touch fooB
find . -name 'foo*' -print0 | parallel -0 -j1 -X echo {} second
生産:
./fooA ./fooB second
-j1
オプションは、parallel
を一度に1つのジョブに制限することに注意してください。これは、find -exec +
から期待される動作を再現するためにここでのみ使用されます。