Como mantenho apenas as últimas 2 pastas e excluo todas as outras em um diretório?

0

Eu tenho um diretório contendo várias pastas como essa:

/
   20170901150843
   20170902123221
   20170903203423
   20170904123245
   20170905115432

Gostaria de excluir todos os diretórios e manter apenas os dois últimos. (Os 2 mais novos)

Como posso fazer isso?

    
por wawanopoulos 10.09.2017 / 20:55

4 respostas

0

Se eles forem nomeados dessa maneira, isso funcionará.

find . -maxdepth 0 -type 'd' | sort -r | tail -n +2 | while read line; do rm -rfv "$line"; done

Explicação:

  1. Localizar diretórios no diretório de trabalho atual
  2. Ordene seus nomes na ordem inversa (importante para a próxima etapa)
  3. Leia todas as primeiras duas linhas de entrada para a saída
  4. Remove (de forma recursiva, forçada e com detalhes) a entrada (neste diretório) com o nome correspondente a cada linha de entrada
por 10.09.2017 / 21:04
0

Eu produziria essa lista de 1 coluna de nomes de diretório em um arquivo chamado bb.out por exemplo. Edite o arquivo e remova os dois diretórios que você deseja manter. Certifique-se de remover esses dois diretórios. Em seguida, crie e edite um novo arquivo, digamos aa.out. Em aa.out coloque muitas linhas contendo apenas rm -f Você pode fazer isso de maneira rápida e fácil digitando 5 linhas de rm -rf e então use copy uma vez e cole muitas vezes para fazer aa.out ter tantas ou mais linhas quanto bb. Fora. Agora apenas digite paste aa.out bb.out > cc.out Agora, apenas digite cc.out e ele removerá todos os seus arquivos. O cc.out conterá apenas um número n de linhas de rm -rf filename .

    
por 10.09.2017 / 22:07
0

Os seguintes itens devem ser feitos:

ls -Fd DirPath/20*|grep '/$'|head -n -2|while read -r d; do rm -rf "$d"; done

Isso funciona da seguinte maneira: -

  • ls listas em entradas de ordem de nome em DirPath , começando com 20 .
  • A opção -F classifica os arquivos com um caractere à direita, que é / para diretórios.
  • A opção -d lista nomes de diretórios, não seus conteúdos.
  • grep garante que os arquivos que não são diretórios sejam excluídos.
  • head copia todas as linhas, exceto as duas últimas.
  • while read -r d atribui a variável d a cada diretório por vez.
  • Para cada diretório, rm -rf o remove.

Notas: -

  • Eu recomendo que você coloque echo antes de rm durante o teste, para ter certeza de que está removendo os diretórios desejados.
  • Talvez seja necessário elaborar a máscara se houver outros diretórios começando com 20 , por exemplo, 20[1-9][0-9][01][0-9]* ou algo ainda mais detalhado.
  • Você poderia usar xargs rm -rf em vez do while loop: isso funcionará no seu caso, mas eu permiti que a técnica fosse estendida para o caso mais geral em que pode haver espaços incorporados nos nomes.
por 11.09.2017 / 01:14
0

Tente isso. É sempre bom ser explícito com o que você está tentando fazer.

find . -mindepth 1 -maxdepth 1 -type d | \
    grep -vE '\./(20170904123245|20170905115432)' | \
    xargs rm -rf
    
por 10.09.2017 / 21:08

Tags