Você está realmente conduzindo rm
a saída da tubulação para a entrada de find
. O que você deseja é usar a saída find
como argumentos para rm
:
find -type f -name '*.sql' -mtime +15 | xargs rm
xargs
é o comando que "converte" sua entrada padrão em argumentos de outro programa ou, como eles colocam com mais precisão na man
página,
construir e executar linhas de comando a partir da entrada padrão
Observe que se os nomes dos arquivos puderem conter caracteres em branco, você deve corrigir isso:
find -type f -name '*.sql' -mtime +15 -print0 | xargs -0 rm
Mas, na verdade, find
tem um atalho para isso: a -delete
opção:
find -type f -name '*.sql' -mtime +15 -delete
Esteja ciente dos seguintes avisos em man find
:
Warnings: Don't forget that the find command line is evaluated
as an expression, so putting -delete first will make find try to
delete everything below the starting points you specified. When
testing a find command line that you later intend to use with
-delete, you should explicitly specify -depth in order to avoid
later surprises. Because -delete implies -depth, you cannot
usefully use -prune and -delete together.
PS Observe que canalizar diretamente para rm
não é uma opção, porque rm
não espera nomes de arquivos na entrada padrão. O que você está fazendo atualmente é direcioná-los para trás.