Como outros já disseram, você não deve usar ls
para isso. Mas se o seu ambiente não tem nada mais sensato e você conhece as ressalvas , você pode se safar, se seus nomes de arquivos forem bons o suficiente : sem espaço em branco ou caracteres não imprimíveis, e especialmente nada que o shell interprete como um caractere globbing (pelo menos ?*[]
).
Usar algo como o Perl para classificar os arquivos ou colocar as datas nos nomes dos arquivos para que você possa depender da ordem glob seria melhor.
Com isto dito: em seu segundo trecho, o asterisco é citado, então não acontece a globalização. Você veria um erro sobre some dir/mysql.daily/*
não existente, mas você não o fez desde que redirecionou a saída do erro.
Nomes de arquivos com espaços lhe darão o problema de que a saída da substituição do comando é dividida ao longo dos espaços, então algo como some dir/foo
será dado a rm
em duas partes: some
e dir/foo
. Espero que nenhum deles exista, já que eles serão removidos.
Se apenas o nome do diretório contiver espaços, você poderia apenas cd
primeiro. Ou defina IFS
para conter apenas uma nova linha (em vez do espaço padrão, tabulação, nova linha). Você mencionou um NAS, então é provável que você tenha o busybox. Isso deve funcionar tanto no busybox quanto no bash, e imprimir os nomes dos arquivos, um por linha:
IFS=$'\n'
printf "%s\n" $( ls -t "$bkup_p/mysql.daily/"* | tail -n +6 )
Substitua printf "%s\n"
por rm
para remover os arquivos, se tiver certeza de que funciona corretamente.