O comando find
tem que ter uma maneira de dizer onde o comando que deve ser executado através de -exec
termina. Sem o ;
no final do comando, find
não saberia onde o comando terminava e onde (possivelmente) outros find
sinalizadores continuavam.
Um exemplo absurdo que executa basename
em todos os arquivos e ls
em todos os diretórios:
find . '(' -type f -exec basename {} ';' ')' -o '(' -type d -exec ls {} ';' ')'
Sem o ;
acima, find
não saberia se deve executar basename /some/path
ou basename /some/path ')' -o '(' ...
etc.
Citar ou escapar do ;
é feito apenas para que o shell não o trate como um delimitador de comando.
Um exemplo menos sem sentido que primeiro copia .txt
arquivos para um diretório específico e renomeia os arquivos originais adicionando .done
ao nome deles (se a cópia foi aprovada):
find . -type f -name '*.txt'
-exec cp {} /some/path/dest ';' \
-exec mv {} {}.done ';'
(Note, como Eliah Kagan aponta em comentários, que a construção {}.done
é estritamente falando não portável, mas implementação definida . Uma implementação pode escolher não expandir os caracteres {}
para Na minha experiência, todas as find
implementações do expandem {}
para o nome do caminho atual mesmo quando concatenadas com outra string como essa.)
Sem o ;
no exemplo anterior, find
não saberia se queremos executar o comando cp
no arquivo encontrado junto com /some/path/dest
, um arquivo chamado -exec
, mv
etc.