Presumindo a data GNU e o GNU, você pode fazer desta maneira
#!/usr/bin/env bash
prefix="/interesting/data/filename-"
ref=/tmp/ref.$$
one_month_ago=/tmp/one_month_ago.$$
results=/tmp/results.$$
# create a file whose timestamp is "one month ago"
touch "$one_month_ago" -t $(date -d "-1 month" +%Y%m%d%I%M.%S)
while read -r file ; do
# strip the prefix, leaving the suffix
datestr=$(tail -c $(( ${#file} - ${#prefix} + 1 )) <<<"$file")
# cut the date and time out of the suffix
date=$(cut -d- -f1-3 <<<"$datestr")
time=$(cut -d- -f 4- <<<"$datestr" | tr - :)
# create a reference file whose timestamp matches the string from $file
touch "$ref" -t $(date -d "$date $time" +%Y%m%d%I%M.%S)
# ask find whether the reference file is not neewer (aka "is older")
# than one month ago
find "$ref" -not -newer "$one_month_ago" > "$results" &&
# results from find?
[ -s "$results" ] &&
# then rm the corresponding file
echo rm -f -- "$file"
done < <(find -path "$prefix"'*')
# clean up
rm -f "$ref" "$one_month_ago" "$results"
Mas não é exatamente um oneliner.
Como isso está sendo testado e um pouco perigoso, incluí um prefixo echo
no comando rm
, então você precisará removê-lo assim que verificar que os resultados estão corretos.
Uma fraqueza aqui está na seleção inicial de arquivos. -path "$prefix"'*'
presume caminhos absolutos e irá quebrar de outra forma; uma seleção mais inteligente é provavelmente melhor, mesmo se for um simples shell glob (ou seja, substituir o loop while por for file in "$prefix*" ; do ... done
. Eu não fiz isso porque não sei se essa expansão glob iria ou não transbordar o máximo comprimento do comando.