
Como parte da limpeza do disco, agora sou obrigado a excluir todas as pastas e seu conteúdo criado nos últimos 3 dias (não na data comercial atual):
Exemplo - a data de hoje é 20191121, então:
/opt/png/wsm/data/workdir/batch/*20191120*
/opt/png/wsm/data/workdir/batch/*20191119*
/opt/png/wsm/data/workdir/batch/*20191118*
Tudo o que posso fazer agora é pegar a lista:
ls -d */ | grep 20191118 (and then 19 and 20)
Como posso verificar quanto tamanho posso economizar excluindo uma(s) pasta(s) datada(s) específica(s) e seu conteúdo?
A versão bash no servidor é:
bash-3.2$ bash --version
GNU bash, version 3.2.57(1)-release (i386-pc-solaris2.10)
Copyright (C) 2007 Free Software Foundation, Inc.
Responder1
Ao limpar arquivos e pastas, você pode usar o du
comando.
du
lista o uso de espaço em disco,tem uma --time
opção, e pode ser usadoapenas para diretórios. Combinando-os:
du -h */ --time | grep -E '2019\-09\-(18|19|20)'
Isso irá capturar qualquer subdiretório cujo conteúdo foi criado ou modificado pela última vez em 18, 19 ou 20 de novembro. Ele exibirá o tamanho ( -h
legível por humanos), a data de modificação e, finalmente, o caminho.
Responder2
A resposta anterior falhará se os diretórios que você tentar rm contiverem mais de 5.000 arquivos. Isso deixará você com diretórios antigos não excluídos.
Em vez disso, use find com "-exec rm {} \+" que chamará rm uma ou mais vezes com um máximo de 5.000 argumentos para cada chamada.
Para encontrar arquivos/diretórios modificados, use find
find . -type d -atime n # for exact number of days
find . -type d -atime +n # for greater than n days
Você pode adicionar a opção -daystart para medir os tempos desde o início de hoje, em vez de 24 horas atrás
Em seguida, use "-exec rm {} \+" para remover ou "-exec du -sh {} \;" para obter o uso do disco de cada diretório.
Considere também a opção -maxprofundidade para chamadas find + du para limitar a localização aos diretórios de nível superior.
Consulte "man find" para obter mais informações (no terminal (melhor) ou em man7.org para obter uma página de manual atualizada:http://man7.org/linux/man-pages/man1/find.1.html, mas não do Die.net (eles até removem os carimbos de data e hora da página para que você não conheça suas páginas de manual ou anos de idade e desatualizados)).
Responder3
Em seguida, uma sintaxe muito mais curta e (do meu ponto de vista) mais legível para a solução @Kusalananda, e usando date em vez de gdate (embora talvez gdate seja uma data equivalente no solaris?):
days=$(echo -e "1 day ago \n 2 days ago \n 3 days ago" | date -f - +'%Y%m%d')
dpath="/opt/png/wsm/data/workdir/batch"
for day in $days ; do
du -s -h "$dpath/$day"
rm -r -f "$dpath/$day"
done
Responder4
Se o seu sistema Solaris tiver bash
, normalmente também terá zsh.
Como esse formato de data é classificado como números, você pode usar <start-end>
o operador glob de intervalo de números decimais do zsh:
zsh -c '
zmodload zsh/datetime
now=$EPOCHSECONDS day=$(( 24 * 60 * 60 ))
for var t (start $(( now - 3*day )) end $(( now - 1*day )) )
strftime -s $var %Y%m%d $t
range="<$start-$end>"
rm -rf -- *$~range*(/)
'
Tenha em atenção que se for executado no dia errado do ano, a meio da noite, ao mudar de/para o horário de verão, subtrair 24*60*60 segundos da hora atual poderá levá-lo ao mesmo dia ou a 2 dias atrás.
Para obter o c
uso umulativo do disco desses diretórios, substitua rm -rf
por du -c
. Se essa é a quantidade de espaço que será recuperada após removê-los, depende se algum arquivo nesses diretórios possui links físicos em outro lugar ou não.