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
-exec
açã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 quexargs
constró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 find
encontrados. 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. 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 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.