Como apagar todas as subpastas X mais recentes de uma pasta?

1

Eu vi alguns forros usando ls, mas gostaria de evitar isso.

Estou escrevendo um script que copia código para o meu servidor em uma pasta com registro de data e hora. A versão 'atual' é sempre ligada por links simbólicos a um caminho constante. Dessa forma, posso reverter se algo der errado. Agora, cada implantação cria uma nova pasta, mas eu gostaria de manter apenas as 3 últimas.

Aqui está minha versão atual:

ls -tp | grep '/$' | grep -v 'current\|shared' | tail -n +4 | xargs -d '\n' rm -rf --

Isso é executado na pasta que contém, exclui os arquivos e as duas pastas 'atual' e 'compartilhada' que desejo manter (atualmente, o link simbólico mencionado acima) e exclui todos, exceto os 3 mais recentes, conforme classificados por ls -t .

Existe uma maneira de fazer isso sem ls e usando apenas o bash e o conjunto de ferramentas do gnu?

Todas as pastas destinadas à remoção são nomeadas seguindo este formato:

$timestamp.$branch.$sha1

Onde SHA1 e branch são informações do git sobre o que exatamente foi implantado.

O servidor executa o Ubuntu Xenial.

Editar: forneça alguns exemplos de como as pastas se parecem

Aqui está uma listagem da pasta de implantação, como está agora:

drwxr-x--- 13 app www-data 4096 Mar 29 00:10 1490738956.develop.b806/
drwxr-x--- 13 app www-data 4096 Mar 29 00:19 1490739485.develop.ae01/
drwxr-x--- 14 app www-data 4096 Mar 29 03:33 1490751118.develop.f5b0/
lrwxrwxrwx  1 app www-data   40 Mar 29 03:33 current -> /home/app/deploy/1490751118.develop.f5b0/
drwx------  5 app root     4096 Mar 10 04:12 shared/
    
por mkaito 29.03.2017 / 15:10

2 respostas

1

Como excluir todas as 3 subpastas mais recentes em uma pasta?

Você pode usar find , sort , awk , xargs e finalmente rm :

find * -maxdepth 0 -type d -not -path "current" -not -path "shared" -printf "%T@ %p\n" | sort -nr | awk 'NR > 3 {print $2}' | xargs rm -rf

Repartição:

find ferramenta versátil para procurar por arquivos e diretórios e, possivelmente, executar comandos neles

* leva em consideração elementos na pasta atual

-maxdepth 0 não procura em subpastas

-type d procura diretórios

-not -path "current" exclui o diretório chamado "atual"

-not -path "shared" exclui o diretório chamado "shared"

-printf "%T@ %p\n" imprime os resultados, anexando o registro de data e hora na frente dos nomes dos diretórios. Isso pode ser omitido no seu caso, uma vez que os diretórios já estão com registro de data e hora.

| sort -nr classifica a lista de acordo com o timestamp, na ordem inversa

| awk 'NR > 3 {print $2}' imprime todos, exceto os três primeiros resultados, omitindo o registro de data e hora que foi adicionado anteriormente. É aqui que você escolhe quantos para manter, basta substituir o número 3

| xargs rm -rf exclua esses diretórios e todo o conteúdo deles

Editar: no seu caso, como os nomes dos diretórios já começam com um registro de data e hora, não há necessidade de adicionar o registro de data e hora novamente para que sort -nr seja efetivo. Observe que a sintaxe awk precisa ser editada de acordo.

find * -maxdepth 0 -type d -not -path "current" -not -path "shared" | sort -nr | awk 'NR > 3 {print $0}' | xargs rm -rf

Referência: consulte estes two útil / semelhante Q & A.

    
por 29.03.2017 / 15:55
0

Na sua forma mais básica

touch -t 201003160120 some_file
find . -maxdepth  0 -type d ! -newer some_file -name \*.develop.\* -delete

Como retirado do link

! -newer some_file diz para corresponder a algo não mais recente que 'some_file'

-name \*.develop.\* diz para corresponder apenas os nomes que correspondem a esse padrão (* .develop. *)

-delete - Espero que isso não exija nenhuma explicação, tenha cuidado! (Use -print ao testar!)

-type d - apenas diretórios

-maxdepth 0 - não recorre a subpastas.

    
por 29.03.2017 / 15:26