Localizar e remover subpastas mantendo apenas as mais recentes

2

Estou tentando configurar uma forma automática, para uma determinada pasta, para remover todas as subpastas, mas as mais recentes criadas.

Por exemplo, gostaria de manter apenas as três subpastas mais recentes e remover todas as outras subpastas.

Imagine a pasta dada:

/some/specific/folder
    /subfolder1
    /subfolder2
    /subfolder3
    /subfolder4
    /subfolder5
    /subfolder6
    /subfolder7
    /subfolder8
    /subfolder9
    /subfolder10

Gostaria de excluir todas as subpastas, mas manter subfolder8 , subfolder9 e subfolder10 ...

Por enquanto, consegui listar os arquivos que gostaria de manter, mas como "inverter" dentro de um comando shell?

cd /some/specific/folder/
ls -tr | head -3

# Gives the following result
subfolder8
subfolder9
subfolder10

# And I am looking for the following :
subfolder1
subfolder2
subfolder3
subfolder4
subfolder5
subfolder6
subfolder7

Alguma ideia?

    
por Flo Schild 14.09.2016 / 16:38

2 respostas

5

Se ls -tr | head -3 lhe der as 3 pastas corretas para manter, então ls -tr | tail -n +4 lhe dará todas as outras pastas (pula as 3 primeiras linhas).

    
por 14.09.2016 / 16:54
3

com zsh :

cd /some/specific/folder && echo rm -rf -- *(/n[1,-4])

Removeria todas, exceto as três últimas pastas ( / ) na ordem de classificação numérica ( n ) (onde subfolder10 ordena após subfolder2 ), excluindo as ocultas.

Remova o echo para realmente executar a operação.

Observe que o tempo de criação não é registrado em muitos sistemas e, quando é (como no Linux recente), não há uma maneira fácil de recuperá-lo. Tudo em que você pode confiar é a hora da última modificação (a data mostrada na saída ls -l ).

Para remover todos, exceto os últimos três últimos modificados, ainda com zsh :

cd /some/specific/folder && echo rm -rf -- *(/Om[1,-4])

Om ordens reversas por hora de modificação (do mais antigo para o mais novo como ls -tr ).

Se você não tem ou não pode instalar zsh , mas está em um sistema GNU recente, você pode fazer isso:

(export LC_ALL=C
cd /some/specific/folder &&
  find . ! -name . -prune -type d ! -name '.*' -printf '%T@\t%f
(export LC_ALL=C
cd /some/specific/folder &&
  find . ! -name . -prune -type d ! -name '.*' -printf '%T@\t%f
cd /some/specific/folder &&
  ls -pt | grep '/$' | tail -n +4 | xargs echo rm -rf --
' | tr '\n
cd /some/specific/folder && echo rm -rf -- *(/n[1,-4])
' '
cd /some/specific/folder && echo rm -rf -- *(/Om[1,-4])
\n' | sort -rn | tail -n +4 | cut -f 2- | tr '
(export LC_ALL=C
cd /some/specific/folder &&
  find . ! -name . -prune -type d ! -name '.*' -printf '%T@\t%f
(export LC_ALL=C
cd /some/specific/folder &&
  find . ! -name . -prune -type d ! -name '.*' -printf '%T@\t%f
cd /some/specific/folder &&
  ls -pt | grep '/$' | tail -n +4 | xargs echo rm -rf --
' | tr '\n%pre%' '%pre%\n' | sort -rn | tail -n +4 | cut -f 2- | tr '%pre%\n' '\n%pre%' | xargs -r0 echo rm -rf --)
' | sort -rnz | tail -zn +4 | cut -zf 2- | xargs -r0 echo rm -rf --)
\n' '\n%pre%' | xargs -r0 echo rm -rf --)
' | sort -rnz | tail -zn +4 | cut -zf 2- | xargs -r0 echo rm -rf --)

Para sistemas GNU menos recentes ( -z foi adicionado apenas recentemente a alguns desses utilitários):

%pre%

Se nenhum dos nomes de arquivo no diretório contiver novas linhas, espaços em branco ou citações ou barras invertidas, você também poderá fazer:

%pre%

Para uma classificação numérica como zsh ' *(n) , consulte também a opção GNU ls -v .

    
por 14.09.2016 / 16:50

Tags