Comando que exclui todos os arquivos, pastas e subpastas antigos

Comando que exclui todos os arquivos, pastas e subpastas antigos

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_folder2a data não foi atualizada depois de new_filecriada.

Preciso de um comando que não exclua old_sub_folder2/old_sub_folder3/new_file

Responder1

O problema é que você adicionou a -ropção ao seu rmcomando. Isso excluirá as pastas mesmo que não estejam vazias.

Você precisa fazer isso em duas etapas:

  1. Exclua apenas oarquivos antigos:

    find . -type f -mtime +31 -delete

  2. 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 finde olhamos apenas directoriesos 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 -quitmas não é POSIXpor isso que nos contentamos -prune).

Então procuramos o resultado desta findoperaçã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.

informação relacionada