O problema aqui é que você está usando o shell globs ao invés de find
para listar os arquivos txt (ele também excluirá arquivos txt ocultos, e se algum .txt
for do tipo type, ele entrará em -los para apagar todos os arquivos antigos lá). Shells como bash
, quando o glob não corresponde a nenhum arquivo, passa o glob asis para find
e find
reclama sobre esse arquivo *.txt
não existente.
Você poderia apenas fazer:
LC_ALL=C find "/h/$USER/." ! -name . -prune \
-name '*.txt' ! -type d -mtime +30 -print -exec rm -f {} + |
grep '^' > /dev/null || echo >&2 No text files to del
O grep
é para verificar se find
produz alguma saída (sem erros), então nós enviamos a mensagem Nenhum arquivo de texto para del se não foi (remova o > /dev/null
se você deseja ver os arquivos que tentamos excluir). Observe que perdemos o status de saída de find
no processo.
Você também pode usar zsh
em vez disso, cujas globs podem verificar as idades dos arquivos (você já está usando a sintaxe zsh
não citando essa $USER
):
oldfiles=(/h/$USER/*.txt(NDm+30^/))
if (($#oldfile)); then
rm -f -- $oldfiles
else
echo >&2 No text files to del
fi