find /home/foo -maxdepth 1 -iname log\* -type f -mmin +1800 |
sort | head -n -1 | xargs rm
Ou se você quiser usar mtime
em vez do nome do arquivo:
find /home/foo -maxdepth 1 -iname log\* -type f -mmin +1800 -exec ls -t {} + |
tail -n +2 | xargs rm
A partir dos comentários do @Stephane, uma abordagem mais robusta seria:
IFS=$'\n'
set -f
rm $(
find /home/foo -maxdepth 1 -iname log\* ! -name $'*\n*' -type f -mmin +1800 |
sort | head -n -1 )
Ou para o shell POSIX (ainda requer ferramentas GNU):
IFS='
'
ex_newline='*
*'
set -f
rm $(
find /home/foo -maxdepth 1 -iname log\* ! -name "$ex_newline" -type f -mmin +1800 |
sort | head -n -1 )
Um único pipeline (robusto) pode ser usado com uma versão recente do GNU sed
/ sort
(e o GNU encontra com todos os itens acima):
find /home/foo -maxdepth 1 -iname log\* -type f -mmin +1800 -print0 |
sort -z | sed -z '$d' | xargs -0 rm