web-dev-qa-db-ja.com

find -execdir <command> +はどのように機能しますか?

指定されたテストに対して一致するすべてのファイルに対してfind -tests -execdir <command> '{}' ';'commandを実行することを理解しています。 -execdirを使用する場合、コマンドは一致するファイルと同じ親ディレクトリで(一致するすべてのファイルに対して)実行されます。{}は一致するファイルのベース名を表すためです。

ここで問題となるのは、+の代わりに';'を使用して複数のファイルを一度に操作する場合、これはどのように行われるのでしょうか。 find -tests -execdir <command> '{}' +を使用すると、すべてのファイルが指定されたコマンドへの引数として提供されます(最大引数を超えない方法で)。見つけるは、それらすべてに対して一度に<command>をどのように実行しますか?

1
joker

findが次のファイルを見つけたとしましょう。

./foo/bar
./foo/baz
./foo/quux

-execdir [...]+を使用すると、効果的な結果のコマンドは次のようになります。

( cd ./foo; command bar baz quux )

(事実上)これとは対照的に、-execdir [...] \;を使用する場合:

( cd ./foo; command bar )
( cd ./foo; command baz )
( cd ./foo; command quux )

同じことがexecdirではなく-execにも当てはまりますが、作業ディレクトリを変更するのではなく、パスを指定します。 -exec [...]+を使用すると、効果的な結果のコマンドは次のようになります。

command ./foo/bar ./foo/baz ./foo/quux

(事実上)これとは対照的に、-exec [...] \;を使用する場合:

command ./foo/bar
command ./foo/baz
command ./foo/quux

2つのディレクトリにあるファイルでこれがどのように動作するかを見てみましょう。

$ tree
.
├── bar
│   ├── bletch
│   └── freeble
└── foo
    ├── bar
    ├── baz
    └── quux
$ find . -type f -exec echo {} \;
./foo/baz
./foo/quux
./foo/bar
./bar/bletch
./bar/freeble
$ find . -type f -execdir echo {} \;
./baz
./quux
./bar
./bletch
./freeble
$ find . -type f -exec echo {} +
./foo/baz ./foo/quux ./foo/bar ./bar/bletch ./bar/freeble
$ find . -type f -execdir echo {} +
./baz ./quux ./bar
./bletch ./freeble
2
DopeGhoti