Mover arquivos para outro diretório mais antigo que uma data

28

Estou procurando uma solução para mover arquivos que são um ano mais antigos a partir de hoje. Minha partição de log está ficando cheia, mas não consigo removê-los. Eles são necessários por um longo tempo. De qualquer forma, uma solução que eu criei é:

find /sourcedirectory -mtime 365 -exec mv "{}" /destination/directory/ \;

Isso funcionaria? Perguntando por causa do " -mtime 365 ", isso moveria os arquivos que são anos mais antigos a partir de hoje para um novo local?

Obrigado!

mYzk
fonte

Respostas:

40

Você está quase certo. -mtime 365serão todos os arquivos com exatamente 365 dias. Você deseja aqueles com 365 dias ou mais, o que significa adicionar um +antes do número como este -mtime +365.

Você também pode estar interessado no -maxdepth 1sinalizador, que impede a movimentação de itens nos subdiretórios.

Se você quiser ter certeza de que está apenas movendo arquivos, não diretórios, adicione -type fà linha.

No final da linha, adicionamos \;para que findsaiba que é o fim do comando que estamos executando.

Portanto, a linha deve ser:

find /sourcedirectory -maxdepth 1 -mtime +365 -type f -exec mv "{}" /destination/directory/ \;

Para garantir a segurança, comece apenas com ls -l em vez de mv - para verificar com antecedência se está obtendo exatamente os arquivos desejados, antes de executá-lo novamente com mv, desta forma:

find /sourcedirectory -maxdepth 1 -mtime +365 -type f -exec ls -l {} \;
Jenny D diz Restabelecer Monica
fonte
3
Lembre-se de que mtimeé o tempo de modificação (que soa como o que você provavelmente deseja - na maioria das vezes). Se esses logs forem lidos / consultados com frequência, você poderá usar -atime(última hora de acesso).
voretaq7
2
O que a barra invertida no final desta linha faz?
Ben Liyanage 19/03/16
11
@BenLiyanage A barra invertida é um caractere de escape para o ponto e vírgula a seguir. O ponto e vírgula significa o final da execdeclaração. Veja a página de manual para find.
Jenny D diz Reinstate Monica
4

Cuidado ao usar as soluções acima, usei-as e acabei movendo todos os arquivos em todas as subpastas !!!!

Este comando move todos os arquivos no diretório / source e todas as subpastas no diretório de origem:

find /sourcedirectory -mtime +365 -exec mv "{}" /destination/directory/ \;

Em vez disso, use a opção -maxdepth 1 apenas para arquivos no diretório / sourced

find /sourcedirectory -maxdepth 1 -mtime +365 -exec mv "{}" /destination/directory/ \;
harleygolfguy
fonte
A resposta com a classificação mais alta contém esta nota e sugere o uso -type f. Em vez disso, você quis dizer com isso que as subpastas são movidas, mas o conteúdo delas permanece nas subpastas, em vez de sair delas ou ...?
de Austin
11
não, quero dizer que 'find' encontrará todos os arquivos no diretório / sourced e todas as subpastas desse diretório / sourced, o que eu não pensava na época. O '-maxdepth 1' restringe o 'encontrar' a única / sourcedirectory
harleygolfguy
BTW, eu teria tido isso apenas como um comentário para a resposta mais bem classificada, o que foi uma boa resposta, mas não tenho reputação. :)
harleygolfguy
0

Você pode usar este comando e especificar que você encontrará apenas arquivos, não diretório, e o arquivo tenha mais de um ano

find /sourcedirectory -type f -mtime +365 -exec mv "{}" /destination/directory/ \;
cuonglm
fonte
Por que ele deveria usar rm? Seu comando exclui os arquivos de log e possivelmente o diretório de destino.
Sven
Ops, meu erro, acho que o @mYzk deseja remover esses arquivos. Editado
cuonglm
0

Você pode usar o comando abaixo com atime se os arquivos forem acessados ​​frequentemente

find /sourcedirectory -type f -atime +365 -exec mv -t /destinationdirectory {} +;
Pradeep Kanoor
fonte
0
$ find /sourcedirectory/ -maxdepth 1 -mtime +365 -exec mv "{}" /destination/directory/ \;

find: missing argument to `-exec'

Correto removeria a barra final final de /sourcedirectory/

$ find /sourcedirectory -maxdepth 1 -mtime +365 -exec mv "{}" /destination/directory/ \;
internetuser2008
fonte
Nos meus testes, não consegui replicar o find: missing argumenterro, mas concordo que a eliminação da barra final /sourcedirectoryestá correta.
guzzijason