Por que termino com 4 invocações em vez de 3 ao usar esse achado -execdir {} + (mais)?

8

Eu li aqui que você pode contar o número de invocações commandno -exec command {} +canalizando | wc -laté o final dele.

Embora eu entenda que isso -execdiré diferente, para cada subdiretório correspondente finddescoberto, ele executa uma invocação do commandsubdiretório em que está contido, se eu tiver mais de um arquivo que corresponda a um subdiretório, eu acabo com o número de invocações igual ao número de subdiretórios correspondentes, e não o número de invocações que correspondem ao número de arquivos correspondentes nesses subdiretórios?

Estou terminando com o último quando executo o seguinte:

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

A página de manual dos execdir command {} +estados em que o primeiro deve ser o caso:

Assim como a -execação, a +forma de -execdircriará uma linha de comando para processar mais de um arquivo correspondente, mas qualquer chamada especificada commandlistará apenas os arquivos existentes no mesmo subdiretório.


ie

Estou entendendo:

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

Quando estou esperando isso, com base na página de manual:

./file1inDir1 ./file2inDir1
./file3InDir2
./file4InDir3
leeand00
fonte
Você não pode contar invocações de comando em geral dessa maneira. Se o comando for echoe os argumentos forem gerados {} +e você não tiver novas linhas em seus nomes de arquivos (a maioria das pessoas não) ENTÃO, o número de linhas é o número de chamadas e ele funciona. Se comando é dizer head -n 999000 /dev/urandomque dá terrivelmente errado.
David_thompson_085

Respostas:

11

Esta é uma questão de desempenho de find. Na findutilsversão 4.3.4, uma solução alternativa precisava restringir o número de argumentos que -execdir ... {} +serão usados ​​para 1. Na versão 4.5.9, o limite foi removido.

Veja um exemplo:

$ 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

Com -execdir {} +, o comando deve ser executado 3 vezes. A segunda invocação deve ter 3 argumentos.

Com 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

Com 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
fonte