Comando que exclui todos os arquivos, pastas e subpastas antigos

4

Eu preciso de um comando que exclua todos os arquivos, pastas e subpastas que não foram atualizados por mais de 31 dias. Eu tentei esse aqui

find . -mindepth 1 -mtime +31 -exec rm -rf "{}" \;

Mas se eu tiver uma hierarquia como essa

.
├── old_sub_folder1
└── old_sub_folder2
    ├── old_file
    └── old_sub_folder3
        └── new_file

em que old_* são pastas / arquivos antigos e new_file é um novo arquivo.

Este comando irá deletar todo o conteúdo. Porque old_sub_folder2 date não foi atualizado depois que new_file foi criado.

Eu preciso de um comando que não excluiria old_sub_folder2 / old_sub_folder3 / new_file

    
por Vitalii Vitrenko 10.04.2017 / 15:28

2 respostas

4

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

Você precisa fazer isso em duas etapas:

  1. Exclua somente os arquivos antigos :

    find . -type f -mtime +31 -delete

  2. Para excluir pastas antigas, se estiverem vazias, podemos dar uma olhada aqui , e ajuste um pouco:

    find . -type d -empty -mtime +31 -delete

por 10.04.2017 / 15:43
0
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
' {} {} \;

No diretório atual, lançamos find e observamos apenas directories que não foram atualizados desde os últimos 31 dias. E em cada um desses diretórios, mergulhamos e procuramos por algo que não tenha mais de 31 dias, e ao encontrá-lo, fazemos eco a um personagem fictício e também podamos qualquer pesquisa avançada (idealmente devemos terminar nossa busca aqui por meio de -quit , mas não é POSIX , portanto, aceitamos -prune ).

Em seguida, procuramos o resultado dessa operação find e, se ela estiver vazia, sabemos que nem um elemento (file / dir / link / etc.) era novo e, portanto, esse dir. é seguro para exclusão.

    
por 10.04.2017 / 23:13