Exclua todos os diretórios, exceto os mais recentes

2

Eu gostaria de escrever um script que exclua todos os diretórios (que não estão vazios) de um diretório, mas mantenha o mais recente. Isso é possível e como?

    
por Captain Harlock 03.08.2016 / 11:56

2 respostas

1

Aqui está uma maneira de fazer isso usando find .

find -type d ! -wholename $(find -type d -printf '%T+ %p\n' | sort -r | head -1 | cut -d" " -f2) ! -wholename "." -exec rm -r {} +

Falha no comando:

  • find -type d a primeira parte diz ao find para pesquisar somente diretórios
  • ! -wholename exclui ocorrências com o seguinte nome completo. A parte seguinte (entre $() ) é avaliada e usada como nome de arquivo aqui
    • $(find -type d -printf '%T+ %p\n' | imprime timestamps para diretórios
    • sort -r | classifica-os do mais novo para o mais antigo
    • head -1 | leva apenas a primeira linha (diretório mais recente)
    • cut -d" " -f2) remove o registro de data e hora da saída
  • ! -wholename "." exclui ocorrências com o nome completo . . Você não pode remover o diretório em que você está trabalhando.
  • -exec rm -r {} + remove os arquivos correspondentes.

Você deve executar o comando sem a última parte ( -exec rm -r {} + ) primeiro, para ver quais diretórios serão removidos.

Exemplo:

conteúdo do diretório:

Aug  4 14:38 bar/
Aug  4 14:38 bla
Aug  4 14:38 foo/
Aug  4 14:41 foobar/

comando de execução:

find -type d ! -wholename $(find -type d -printf '%T+ %p\n' | sort -r | head -1 | cut -d" " -f2) ! -wholename "." -exec rm -r {} +

conteúdo resultante do diretório:

Aug  4 14:38 bla
Aug  4 14:41 foobar/

observe que bla é um arquivo e não um diretório. Por isso, não será removido.

    
por Wayne_Yux 04.08.2016 / 14:57
0

Encontrei uma resposta e deixo aqui, pode ser útil para outros usuários:

cd /path/to
rm -r 'ls -t | awk 'NR>1''
    
por Captain Harlock 04.08.2016 / 09:10