Como a linha de comando é construída para find -exec command {} +

Como a linha de comando é construída para find -exec command {} +

Acho que a explicação do manual findé um pouco confusa.

Qual é o significado de "mas a linha de comando é construída anexando cada arquivo selecionado no final; o número total de invocações do comando será muito menor que o número de arquivos correspondentes" Por que isso?

Abaixo está o texto deman find

-exec comando {} +

Esta variante da -execação executa o comando especificado nos arquivos selecionados, mas a linha de comando é construída anexando cada nome de arquivo selecionado no final; o número total de invocações do comando será muito menor que o número de arquivos correspondentes. A linha de comando é construída da mesma maneira que xargsconstrói suas linhas de comando. Apenas uma instância de '{}' é permitida no comando. O comando é executado no diretório inicial.

Responder1

Qual é o significado de "mas a linha de comando é construída anexando cada arquivo selecionado no final; o número total de invocações do comando será muito menor que o número de arquivos correspondentes" Por que isso?

Vamos criar alguns arquivos de exemplo:

touch {1..5}.txt

Primeiro, vamos executar um comando find:

$ find . -exec echo my files are: {} +
my files are: . ./1.txt ./5.txt ./4.txt ./3.txt ./2.txt

Como você pode ver, {}é substituído pela lista de todos os arquivos findencontrados. Neste exemplo, temos seis arquivos correspondentes, mas echoé executado apenas uma vez.

Observe que os shells têm um limite no número de caracteres que aceitarão em uma única linha de comando. findsabe disso e, se houver muitos arquivos para colocar em uma linha de comando, findexecutará echovárias vezes com arquivos diferentes até que todos os nomes de arquivos tenham sido processados. É por isso que “o número de invocações do comando será muito menor que o número de arquivos correspondentes”.

Vamos testar isso criando vários arquivos em nosso diretório:

touch this_is_a_long_file_name{1..10000}.txt

Agora, vamos executar um comando find:

$ find . -exec bash -c 'echo $# files on this command line' _ {} +
3756 files on this command line
3754 files on this command line
2491 files on this command line

Como você pode ver, embora este diretório tivesse mais de 10.000 arquivos, o comando exec foi executado apenas três vezes.

informação relacionada