Qual é o argumento que falta para -exec?

Qual é o argumento que falta para -exec?

Eu uso o seguinte comando para limpar um diretório de arquivos e diretórios com mais de 30 dias e movê-los para um diretório de arquivo que posso excluir após algumas semanas se ninguém solicitar seus arquivos de volta. O diretório de destino possui subdiretórios por nome de usuário, assim como o diretório de arquivo.

Este é o comando que eu uso:

find /path/to/directory/username/ -mtime +30 -exec mv "{}" /path/to/archive/username/ \;

Sugeri uma versão modificada disso para responder a uma pergunta no ask ubuntu, outro usuário editou o código para alterar o final da linha \;por +ser mais rápido (e mais correto?).Veja aqui

No entanto, usar +desta forma funciona se o -execcomando estiver, ls -lhmas não no comando real que eu uso. Se eu tentar, +recebo uma mensagem de erro:

find: missing argument to '-exec'

Não entendo por que está se comportando dessa maneira ou qual seria o comando correto. Por favor, não poste apenas uma correção de comando, gostaria de entender, em vez de apenas seguir cegamente uma sugestão.

Responder1

O usuário daquela postagem pode ter dito que o +sinal no final de um -execcomando é mais rápido, mas não por quê.

Vamos supor que o findcomando retorne os seguintes arquivos:

/path/to/file1
/path/to/file2
/path/to/file3

-execO comando normal ( -exec command {} \;) é executado uma vez para cada arquivo correspondente. Por exemplo:

find ... -exec mv {} /target/ \;

Executa:

mv /path/to/file1 /target/
mv /path/to/file2 /target/
mv /path/to/file3 /target/

Se você usar o +sinal ( -exec command {} +), o comando será criado adicionando vários arquivos correspondentes no final do comando. Por exemplo:

find ... -exec mv -t /target/ {} +

Executa:

mv -t /target/ /path/to/file1 /path/to/file2 /path/to/file3

Para usar o +sinalizador corretamente, o argumento a ser processado deve estar no final do comando, não no meio. É por isso que findtrows missing argument to '-exec'no seu exemplo; perde o fechamento {}.

Responder2

O usuário explicou sua edição....

O terminador '+' exec é mais rápido que '\;' consulte https://askubuntu.com/questions/558817/what-is-the-difference-between-using-and-in-exec-command; e criar um arquivo de backup a partir do arquivo original é uma boa ideia

...usandoesse link. Acho que basicamente, em vez de usar vários comandos, ele envia todos os nomes de arquivos para uma instância de comando, para acelerar as coisas. Aqui está um exemplo deaqui:

Usar -exec com ponto e vírgula ( find . -exec ls '{}' \;), executará

ls file1
ls file2
ls file3

Mas se você usar um sinal de mais ( find . -exec ls '{}' \+), todos os nomes de arquivos serão passados ​​como argumentos para um único comando:

ls file1 file2 file3

Existem outros formulários disponíveis usando ;e +também (deaqui:)

Portanto, o seguinte exemplo de sintaxe é permitido para o comando find:

find . -exec echo {} \;
find . -exec echo {} ';'
find . -exec echo {} ";"
find . -exec echo {} \+
find . -exec echo {} +

NO ENTANTO, não tenho certeza se isso funcionará com o comando move de qualquer maneira, pois sua sintaxe é mv [OPTION]... SOURCE DEST, a menos que a -topção ou similar seja usada. No entanto, deve funcionar lssem opções extras, etc., pois eles podem entender quando vários nomes de arquivos são fornecidos. O +também pode precisar ser escapado (ou seja \+)

informação relacionada