Preciso de um comando que exclua todos os arquivos, pastas e subpastas que não foram atualizados há mais de 31 dias. Eu tentei este
find . -mindepth 1 -mtime +31 -exec rm -rf "{}" \;
Mas se eu tiver uma hierarquia assim
.
├── old_sub_folder1
└── old_sub_folder2
├── old_file
└── old_sub_folder3
└── new_file
onde old_*
estão as pastas\arquivos antigos e new_file
é um arquivo novo.
Este comando excluirá todo o conteúdo. Porque old_sub_folder2
a data não foi atualizada depois de new_file
criada.
Preciso de um comando que não exclua old_sub_folder2/old_sub_folder3/new_file
Responder1
O problema é que você adicionou a -r
opção ao seu rm
comando. Isso excluirá as pastas mesmo que não estejam vazias.
Você precisa fazer isso em duas etapas:
Exclua apenas oarquivos antigos:
find . -type f -mtime +31 -delete
Para deletar quaisquer pastas antigas, se estiverem vazias, podemos dar uma olhadaaquie ajuste um pouco:
find . -type d -empty -mtime +31 -delete
Responder2
find . -type d ! -name . -mtime +31 -exec sh -c '
case $(find "$1" ! -mtime +31 -exec echo x \; -prune) in
"" ) rm -rf "$1" || echo "Error could not delete folder \"$1\"" ;;
esac
' {} {} \;
A partir do diretório atual, lançamos find
e olhamos apenas directories
os que não foram atualizados desde os últimos 31 dias. E em cada um desses diretórios nós, por sua vez, mergulhamos e procuramos por qualquer coisa que não tenha mais de 31 dias e, ao encontrá-lo, repetimos um caractere fictício e também removemos qualquer pesquisa direta (idealmente, deveríamos apenas encerrar nossa pesquisa aqui por meio de -quit
mas não é POSIX
por isso que nos contentamos -prune
).
Então procuramos o resultado desta find
operação e se estiver vazio sabemos que nem mesmo um elemento (arquivo/diretório/link/etc.) era novo e, portanto, este diretório. é seguro para exclusão.