find e exec apenas no nome do arquivo

1

Preciso encontrar todos os arquivos com mais de X dias e excluí-los localmente e no meu bloco s3. O problema é que o comando find me retorna o caminho completo e o nome do arquivo também. Eu tentei mexer com basename e algumas outras coisas, mas não consegui fazê-lo funcionar. Qualquer ajuda seria muito apreciada.

Por enquanto, a parte 'delete them locally' é ls em vez de rm enquanto eu estava brincando com ele. Para o rm eu preciso do caminho completo.

Eu preciso remover / home / ec2-user / backups / das chamadas do s3cmd.

$ find /home/ec2-user/backups -type f -mtime +3 -exec ls {} \; -exec s3cmd del s3://kisnardonline/{} \;

/home/ec2-user/backups/FILESYSTEM-2016-04-09_00-00.tar.gz
File s3://kisnardonline//home/ec2-user/backups/FILESYSTEM-2016-04-09_00-00.tar.gz deleted
    
por KisnardOnline 13.04.2016 / 07:30

2 respostas

1

Existem várias maneiras pelas quais isso pode ser feito. A combinação de find -print0 e xargs -0 é poderosa e segura para trabalhar em combinação com sed -z (usando NULL como delimitador de linha):

find /home/ec2-user/backups -type f -mtime +3 -print0 |\
  sed -z 's/^.*\?backups/s3:\//' |\
  xargs -0 -n 1 s3cmd del

Como s3cmd não suporta (ainda) a exclusão de vários arquivos, xargs requer -n 1 para limitar a execução a uma linha por vez.

Outra maneira, talvez mais simples, é canalizar find a read e usar substituição de variável bash:

find /home/ec2-user/backups -type f -mtime +3 |\
  while read file; do s3cmd del ${file#*ups/}; done
    
por 13.04.2016 / 11:03
0

Tente esta modificação simples:

cd /home/ec2-user/backups/; find -type f -mtime +3 -exec ls {} \; -exec s3cmd del s3://kisnardonline/{} \;

Dessa forma, todos os caminhos retornados por find são relativos a /home/ec2-user/backups/ e começam com ./ . Ele funcionará se s3cmd e / ou servidor s3 for inteligente o suficiente para interpretar ./ da maneira que deveria (ou seja, s3://foo/./bar é igual a s3://foo/bar etc.).

s3cmd does not work with ./

Nesse caso:

cd /home/ec2-user/backups/; find -type f -mtime +3 | while read F ; do ls "$F"; F="'echo $F | cut -c 3-'"; s3cmd del "s3://kisnardonline/$F"; done
    
por 13.04.2016 / 08:32