Como a linha de comando é construída para encontrar o comando -exec {} +

5

Acho que a explicação manual de find é um pouco incerta.

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 de man find

-exec command {} +

This variant of the -exec action runs the specified command on the selected files, but the command line is built by appending each selected file name at the end; the total number of invocations of the command will be much less than the number of matched files. The command line is built in much the same way that xargs builds its command lines. Only one instance of ‘{}’ is allowed within the command. The command is executed in the starting directory.

    
por Canaryyellow 18.07.2015 / 02:55

1 resposta

5

What is the meaning of "but the command line is built by appending each selected file at the end; the total number of invocations of the command will be much less than the number of matched files" Why is this?

Vamos criar alguns arquivos de amostra:

touch {1..5}.txt

Primeiro, vamos executar um comando de localização:

$ 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 que find encontraram. Neste exemplo, temos seis arquivos correspondentes, mas echo é executado apenas uma vez.

Note que os shells têm um limite no número de caracteres que eles aceitarão em uma única linha de comando. find sabe disso e, se houver muitos arquivos para colocar em uma linha de comando, find executará echo vá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 muitos arquivos em nosso diretório:

touch this_is_a_long_file_name{1..10000}.txt

Agora, vamos executar um comando de localização:

$ 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 tenha mais de 10.000 arquivos, o comando exec foi executado apenas três vezes.

    
por 18.07.2015 / 03:47