Se você quiser fazer o loop de arquivos, nunca use ls
*. tl; dr Existem muitas situações em que você acabaria excluindo o arquivo errado ou até mesmo todos os arquivos.
Dito isto, infelizmente isso é uma coisa complicada para se fazer no Bash. Há uma resposta em find_date_sorted
que você pode usar com pequenas modificações:
counter=0
while IFS= read -r -d '' -u 9
do
let ++counter
if [[ counter -gt 3 ]]
then
path="${REPLY#* }" # Remove the modification time
echo -e "$path" # Test
# rm -v -- "$path" # Uncomment when you're sure it works
fi
done 9< <(find . -mindepth 1 -type f -printf '%TY-%Tm-%TdT%TH:%TM:%TS %pcounter=0
while IFS= read -r -d '' -u 9
do
let ++counter
if [[ counter -gt 3 ]]
then
path="${REPLY#* }" # Remove the modification time
echo -e "$path" # Test
# rm -v -- "$path" # Uncomment when you're sure it works
fi
done 9< <(find . -mindepth 1 -type f -printf '%TY-%Tm-%TdT%TH:%TM:%TS %p%pre%' | sort -rz) # Find and sort by date, newest first
' | sort -rz) # Find and sort by date, newest first
* Sem caras de ataque - também usei ls
antes. Mas isso não é seguro.
Editar: Novo find_date_sorted
com testes unitários.