Pular para o conteúdo

Problema para deletar arquivos via shell script [RESOLVIDO]

Responder tópico
  • Denunciar
  • Indicar
01 02

1. Problema para deletar arquivos via shell script [RESOLVIDO]

Enviado em 08/10/2012 - 16:08h

Boa tarde.

Estou com um problema em um script para eliminar arquivos com mais de 7 dias.
Testei algumas dicas aqui do fórum porém sem sucesso.
Segue meu código


#!/bin/bash
find /home/dell/backup/moodle/ -name '*.gz' -ctime +5 -type f -exec rm {} \;
Obrigado.
Heitor

Responder tópico

2. Re: Problema para deletar arquivos via shell script [RESOLVIDO]

Enviado em 08/10/2012 - 18:35h

E qual é o problema retornado mesmo?

3. Re: Problema para deletar arquivos via shell script [RESOLVIDO]

Enviado em 08/10/2012 - 20:53h

É o seguinte: eu tenho um script que gera o backup de uma base de dados MySQL. Esse backup é executado pelo cron todos os dias às 2 da manhã.
Eu gostaria de fazer um script que apagasse as versões do backup com mais de 7 dias.
Utilizei o código acima para que faça isso porém ele retorna o seguinte erro:
find: missing argument to `-exec'

Tentei várias alternativas que encontrei aqui no fórum para esse propósito porém não obtive sucesso.
Obs: esse script roda na Locaweb
Obrigado

4. Re: Problema para deletar arquivos via shell script [RESOLVIDO]

Enviado em 08/10/2012 - 21:14h

No lugar do -exec rm {} \; pode usar find ~/user -name palavra* | xargs rm

5. Re: Problema para deletar arquivos via shell script [RESOLVIDO]

Enviado em 08/10/2012 - 22:56h

rei_astro, como esse seu comando, como eu posso excluir apenas os arquivos com mais de 7 dias?

6. Re: Problema para deletar arquivos via shell script [RESOLVIDO]

Enviado em 09/10/2012 - 08:25h

htemp escreveu:

find /home/dell/backup/moodle/ -name '*.gz' -ctime +5 -type f -exec rm {} \;

Ora, os arquivos de 7 dias são retornados pelo find. O comando executa rm para cada arquivo retornado. é só substituir -exec rm {} \; por | xargs rm. Ficando assim:
find /home/dell/backup/moodle/ -name '*.gz' -ctime +5 -type f | xargs rm 
Mas para quê o -type f?

7. Re: Problema para deletar arquivos via shell script [RESOLVIDO]

Enviado em 09/10/2012 - 09:01h

Bom dia, tentei o código que me enviaste, porém segue o seguinte erro ocorrido:

: No such file or directory
Tentei, para testar se realmente o script não encontrava os arquivos, o código abaixo. Porém ao rodar o script é criado o arquivo teste.txt com o nome dos arquivos com mais de 5 dias, sem problemas

#!/bin/bash
find /home/dell/backup/moodle/ -name '*.gz' -ctime +5 -type f > teste.txt
Eu defini o arquivo como executável, será que esqueci de mais algo? O que pode estar errado?

Obrigado

8. Re: Problema para deletar arquivos via shell script [RESOLVIDO]

Enviado em 09/10/2012 - 10:11h


O linux possui 3 estampas de tempo em arquivos.

atime, ctime e mtime.

As pessoas entendem rápido o que é atime - data do último acesso, basta uma leitura (read) mesmo que nada seja modificado para mudar o valor atime.


A confusão fica com ctime e mtime.


ctime é a data de criação do inode enquanto mtime é a data de modificação do conteúdo do arquivo.

Resumindo, mtime muda quando você "grava" no arquivo. OU SEJA mtime é a data de nascimento do arquivo que define a sua IDADE.

Observe que vou criar um arquivo com mtime modificado.

#touch --time=mtime -t 201210041400 lucas.txt

Agora olha a listagem longa dele

root@positivo:~/testes# ls -l lucas.txt
-rw-r--r-- 1 root root 0 Out 4 14:00 lucas.txt

Para ver esses 3 tempos de seu arquivo faça

root@positivo:~/testes# stat lucas.txt
File: "lucas.txt"
Size: 6 Blocks: 8 IO Block: 4096 arquivo comum
Device: 801h/2049d Inode: 252476 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2012-10-09 09:56:23.000000000 -0300
Modify: 2012-10-04 14:00:00.000000000 -0300
Change: 2012-10-09 10:01:25.000000000 -0300


Observe que atime e ctime tem data de hoje

Para mudar com touch faça assim....

Change access and modification time to particular timestamp

The following example changes the access and modify timestamp to 15th June 13:30 using touch -t option.

Format for touch -t is : [[CC]YY]MMDDhhmm[.ss]


Olha o funcionamento com os exemplos que fiz abaixo

root@positivo:~/testes# ls -la
total 20
drwxr-xr-x 2 root root 4096 Out 9 10:03 .
drwx------ 4 root root 4096 Out 9 09:51 ..
-rw-r--r-- 1 root root 6 Dez 31 2000 jose.txt
-rw-r--r-- 1 root root 0 Out 4 14:00 lucas.txt
-rw-r--r-- 1 root root 6 Dez 31 2000 maria.txt
-rw-r--r-- 1 root root 24 Out 9 09:51 nomes.txt

Agora a pesquisa com find...

root@positivo:~/testes# find /root/testes/ -maxdepth 1 -mtime +6 -type f

/root/testes/maria.txt
/root/testes/jose.txt



Espero que ajude a resolver... Por favor faça testes antes de por em produção com arquivos reais...


9. Re: Problema para deletar arquivos via shell script [RESOLVIDO]

Enviado em 09/10/2012 - 18:27h

htemp escreveu:

: No such file or directory

Isso ocorre se o nome do arquivo tem mais de uma palavra.

Tente com nomes simples.

find /home/dell/backup/moodle/ -name '*.gz' -ctime +5 -type f | xargs rm 

10. Re: Problema para deletar arquivos via shell script [RESOLVIDO]

Enviado em 09/10/2012 - 18:44h

O engraçado é que aqui o primeiro comando funcionou:

find /home/dell/backup/moodle/ -name '*.gz' -ctime +5 -type f -exec rm {} \; 
Já tentou manualmente se dá certo?

11. Re: Problema para deletar arquivos via shell script [RESOLVIDO]

Enviado em 09/10/2012 - 19:43h

Eu colocaria as chaves entre aspas, no caso do predicado "-exec" do find.

Já usando xargs, se o arquivo tiver uma quebra de linha no nome (que é atípico, mas possível), é bom usar a opção "-0" do xargs, junto com o predicado "-print0" do find.

find /dir -type f -iname \*.gz -ctime +5 -print0 | xargs -0 rm -f 

12. Re: Problema para deletar arquivos via shell script [RESOLVIDO]

Enviado em 09/10/2012 - 22:30h


Já tentou manualmente se dá certo?
Dá certo sim, só não tá rodando via shell script, direto no terminal funciona
01 02

Responder tópico

Responder tópico

Entre na sua conta para responder.

Fazer login para responder