Por que esse comando não remove arquivos como esperado?

0

Este comando no meu script .sh é supostamente para procurar em /home/backup/VBtest para .sql.gz arquivos e remover mais de 5 dias:

find /home/backup/VBtest/*.sql.gz -mtime +5 -exec rm {} \;

Mas isso não acontece. Não me dá nenhum aviso, nenhum erro, apenas uma falha silenciosa. Estou executando no CentOS 6.6.

EDITAR - depois das sugestões de comentários, também testei este find '/home/backup/VBtest' -name '*.sql.gz' -mtime +5 rm {} \; e recebi find: paths must precede expression: rm . Além disso, qual é o argumento para o tempo de criação do arquivo (em oposição ao tempo de modificação do arquivo)?

    
por leylandski 04.09.2015 / 11:09

2 respostas

2

Da página de manual de find :

    Numeric arguments can be specified as

   +n     for greater than n,
   -n     for less than n,
    n     for exactly n.

  -mtime n
          File's data was last modified n*24 hours ago.  See the comments for 
          -atime to understand how rounding  affects  the  interpretation  of
          file  modification times.

   -atime n
          File was last accessed n*24 hours  ago.   When  find  figures  out  
          how  many 24-hour  periods  ago  the  file  was  last  accessed, any 
          fractional part is ignored, so to match -atime +1, a file has to have 
          been accessed at least two days ago.

Portanto, -mtime +5 encontrará esses arquivos alterados pela última vez mais de 5 * 24h atrás e -mtime -5 descobrirá que esses arquivos foram modificados pela última vez menos de 5 * 24 horas atrás. Ele diz claramente que, se você modificou o arquivo / s, seu comando não removerá esses arquivos. Também tente modificar o comando como:

find /home/backup/VBtest/ -maxdepth 1 -name "*.sql.gz" -mtime +5 -exec rm {} \;
    
por 04.09.2015 / 11:25
3

Deveria ser mais parecido com:

find /home/backup/VBtest/  -name '*.sql.gz' -mtime +5 # -exec rm {} \;

(remova o # da parte exec se isso der os resultados corretos) Isso fará a varredura de toda a árvore de diretórios.

/home/backup/VBtest/*.sql.gz por si só seria expandido pelo shell (quase equivalente ao comando find acima com -maxdepth 1) como você pode aprender fazendo

echo /home/backup/VBtest/*.sql.gz 

Você pode ir por uma rota pura se quiser. Todos os shells posix podem comparar timestamps ( [ + -nt para "mais recente que" ou -ot para "mais antigo que") então você só precisa de um timestamp de referência e então filtrar o glob expandido por:

touch /tmp/5dAgo --date '5 days ago'
trap 'rm -f /tmp/5dAgo' exit
for file in /home/backup/VBtest/*.sql.gz; do
   #remove the echo if this give the expected results
   [ "$file" -ot /tmp/5dAgo ] && echo rm "$file" 
done
    
por 04.09.2015 / 11:31