Eu uso o comando a seguir para limpar um diretório de arquivos e diretórios com mais de 30 dias e movê-los para um diretório de arquivamento que eu posso excluir após algumas semanas se ninguém pedir seus arquivos de volta. O diretório de destino possui subdiretórios por nome de usuário, assim como o diretório de archive.
Este é o comando que eu uso:
find /path/to/directory/username/ -mtime +30 -exec mv "{}" /path/to/archive/username/ \;
Sugeri uma versão modificada deste para responder a uma pergunta sobre perguntar ubuntu, outro usuário editou o código para alterar o fim da linha \;
para +
como ele é mais rápido (e mais correto?). Veja aqui
No entanto, o uso +
dessa maneira 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 basta postar uma correção de comando, eu gostaria de entender, em vez de apenas seguir uma sugestão cegamente.
fonte
+
vários argumentos para o mesmo comando, masmv
não consigo lidar com isso!Respostas:
O usuário nesse post pode dizer que o
+
sinal no final de um-exec
comando é mais rápido, mas não o porquê.Vamos assumir o
find
comando retorne os seguintes arquivos:O
-exec
comando normal (-exec command {} \;
) é executado uma vez para cada arquivo correspondente. Por exemplo:Executa:
Se você usar o
+
sinal (-exec command {} +
) o comando é construir, adicionando vários arquivos combinados no final do comando. Por exemplo:Executa:
Para usar o
+
sinalizador corretamente, o argumento a processar deve estar no final do comando, não no meio. É por isso quefind
lançamissing argument to '-exec'
no seu exemplo; falta o fechamento{}
.fonte
find -exec
exige{}
que seja o último argumento, quando usado com+
. Alguém sabe por que essa decisão de design foi tomada, em vez de deixar construções como a linha de comando do OP funcionar?O usuário explicou sua edição ....
... usando este link . Eu 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 daqui :
Existem outras formas disponíveis usando
;
e+
também (de daqui :)Portanto, o seguinte exemplo de sintaxe é permitido para o comando find:
No entanto, não tenho certeza se isso funcionará com o comando move de qualquer maneira, como é a sintaxe
mv [OPTION]... SOURCE DEST
, a menos que a-t
opção ou similar seja usada. No entanto, ele deve funcionarls
sem opções extras, etc., pois elas podem entender quando vários nomes de arquivos são fornecidos. Também+
pode ser necessário escapar (ie\+
)fonte
mv -t
+ 1s!