Pourquoi est-ce que je me retrouve avec 4 invocations au lieu de 3 en utilisant cette -execdir {} + (plus)?

Je lis ici que vous pouvez countr le nombre d'invocations de la command dans la -exec command {} + par la tuyauterie | wc -l | wc -l à la fin de celui-ci.

Bien que je -execdir que -execdir est différent, pour chaque sous-directory correspondant -execdir , il exécute une invocation de la command depuis le sous-directory dans lequel il se trouve, si j'ai plus d'un file qui correspond à un sous- -directory, ne devrais-je pas me refind avec le nombre d'invocations égal au nombre de sous-directorys correspondants, et non le nombre d'invocations correspondant au nombre de files correspondants dans ces sous-directorys?

Je me retrouve avec ce dernier quand je cours ce qui suit:

 $ find . -name "bob*" -execdir echo {} + | wc -l 

La page de execdir command {} + indique que le premier doit être le cas:

Comme avec l'action -exec , la forme + de -execdir va build une command line pour traiter plus d'un file correspondant, mais une invocation de command donnée ne -execdir que les files qui existent dans le même sous-directory.


c'est à dire

Je suis en train:

 ./file1inDir1 ./file2inDir1 ./file3InDir2 ./file4InDir3 

Quand j'attends ceci, basé sur la page de manuel:

 ./file1inDir1 ./file2inDir1 ./file3InDir2 ./file4InDir3 

Ceci est un problème de performance de find . Dans la version 4.3.4 de findutils , une solution de contournement devait restreindre le nombre d'arguments que -execdir ... {} + utilisera pour 1. Dans la version 4.5.9, la limite a été supprimée.

Voir un exemple:

 $ mkdir -p dir{1..3} $ touch dir{1..3}/file1 dir2/file{1..3} $ find . ./dir1 ./dir1/file1 ./dir2 ./dir2/file1 ./dir2/file2 ./dir2/file3 ./dir3 ./dir3/file1 

Avec -execdir {} + , la command doit être exécutée 3 fois. La deuxième invocation devrait avoir 3 arguments.

Avec find 4.4.2:

 $ find-4.4.2 . -name "file*" -execdir sh -c 'echo "Executing $@ in $(pwd)"' find-sh {} + Executing ./file1 in /path/to/dir1 Executing ./file1 in /path/to/dir2 Executing ./file2 in /path/to/dir2 Executing ./file3 in /path/to/dir2 Executing ./file1 in /path/to/dir3 

Avec find 4.6.0:

 $ find-4.6.0 . -name "file*" -execdir sh -c 'echo "Executing $@ in $(pwd)"' find-sh {} + Executing ./file1 in /path/to/dir1 Executing ./file1 ./file2 ./file3 in /path/to/dir2 Executing ./file1 in /path/to/dir3