¿Por qué termino con 4 invocaciones en lugar de 3 cuando uso este find -execdir {} + (más)?

8

He leído aquí que se puede contar el número de invocaciones de commanden -exec command {} +canalizando | wc -lal final de la misma.

Si bien entiendo que -execdires diferente, en eso, para cada subdirectorio coincidente que finddescubre, ejecuta una invocación del commandsubdirectorio que contiene, si tengo más de un archivo que coincida en un subdirectorio, debería ¿Acabo con el número de invocaciones igual al número de subdirectorios coincidentes, y no el número de invocaciones que coinciden con el número de archivos coincidentes en esos subdirectorios?

Estoy terminando con este último cuando ejecuto lo siguiente:

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

La página del manual para los execdir command {} +estados que el primero debería ser el caso:

Al igual que con la -execacción, la +forma del -execdircreará una línea de comando para procesar más de un archivo coincidente, pero cualquier invocación de commandsolo enumerará los archivos que existen en el mismo subdirectorio.


es decir

Me estoy poniendo:

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

Cuando espero esto, según la página del manual:

./file1inDir1 ./file2inDir1
./file3InDir2
./file4InDir3
leeand00
fuente
No puede contar invocaciones de comandos en general de esa manera. Si el comando es echoy los argumentos son generados por {} +y no tiene nuevas líneas en sus nombres de archivo (la mayoría de las personas no las tienen) ENTONCES el número de líneas es el número de invocaciones y funciona. Si el comando es decir head -n 999000 /dev/urandom, va terriblemente mal.
dave_thompson_085

Respuestas:

11

Este es un problema de rendimiento de find. En la findutilsversión 4.3.4, una solución tenía que restringir el número de argumentos que -execdir ... {} +se utilizarán a 1. En la versión 4.5.9 se eliminó el límite.

Ver un ejemplo:

$ 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

Con -execdir {} +, el comando debe ejecutarse 3 veces. La segunda invocación debe tener 3 argumentos.

Con find4.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

Con find4.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
caos
fuente