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 -exec
comando estiver, ls -lh
mas 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 -exec
comando é mais rápido, mas não por quê.
Vamos supor que o find
comando retorne os seguintes arquivos:
/path/to/file1
/path/to/file2
/path/to/file3
-exec
O 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 find
trows missing argument to '-exec'
no seu exemplo; perde o fechamento {}
.
Responder2
O usuário explicou sua edição....
...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 -t
opção ou similar seja usada. No entanto, deve funcionar ls
sem 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 \+
)