Remove todos os arquivos dentro do diretório mais antigo que os dez arquivos adicionados mais recentemente

3

Eu tenho um arquivo de backup compactado (tar), que é adicionado a um diretório periodicamente. Os arquivos adicionados têm uma convenção de nomenclatura da seguinte forma:

JenkinsBackup_$(date +%Y%m%d-%H%M%S).tar.gz

Que resulta em arquivos com nomes semelhantes:

jenkinsBackup_20170630-091543.tar.gz

Meu objetivo é selecionar todos os arquivos dentro do diretório anterior aos dez arquivos mais recentes adicionados ao diretório e excluir esses arquivos. Essencialmente, uma limpeza do diretório a partir da linha de comando.

Alguém pode me ajudar com os comandos de terminal necessários para realizar isso? Não sei como selecionar e remover todos os arquivos em um diretório mais antigo que os dez arquivos mais recentes.

Agradecemos antecipadamente por qualquer ajuda!

    
por J0991 30.06.2017 / 15:26

3 respostas

5

Uma maneira simples que funciona bem com seus nomes de arquivos é usar:

ls -t1 | tail -n +11 | xargs gvfs-rm
  • ls -t1 nos fornece uma lista de arquivos com base no tempo de modificação e os arquivos mais novos são os primeiros.
  • usando tail -n +11 estamos pulando a primeira linha 10 e obtendo tudo o mais
  • então, encaminhamos a lista para xargs gvfs-rm para remoção.

Observe que gvfs-rm move o arquivo para a lixeira, use rm para removê-lo permanentemente.

Se você quiser trabalhar com os nomes dos arquivos em vez do tempo de modificação, use ls -1r | tail -n +11 | xargs gvfs-rm .

Uma solução find semelhante que decide com base nos nomes dos arquivos:

find -type f | sort -r | tail -n +11 | xargs gvfs-rm

ou

find -type f | sort | head -n -10 | xargs gvfs-rm
    
por Ravexina 30.06.2017 / 15:32
1

Se você tiver acesso a zsh , será muito mais fácil do que saltar por cima de arcos com ls , find ou stat . Por exemplo, dado

 % ls -1 JenkinsBackup_*
JenkinsBackup_20170630-095544.tar.gz
JenkinsBackup_20170630-095545.tar.gz
JenkinsBackup_20170630-095546.tar.gz
JenkinsBackup_20170630-095547.tar.gz
JenkinsBackup_20170630-095548.tar.gz
JenkinsBackup_20170630-095549.tar.gz
JenkinsBackup_20170630-095550.tar.gz
JenkinsBackup_20170630-095551.tar.gz
JenkinsBackup_20170630-095552.tar.gz
JenkinsBackup_20170630-095553.tar.gz
JenkinsBackup_20170630-095554.tar.gz
JenkinsBackup_20170630-095555.tar.gz
JenkinsBackup_20170630-095556.tar.gz
JenkinsBackup_20170630-095557.tar.gz
JenkinsBackup_20170630-095558.tar.gz

Listar por hora de modificação, a mais nova primeiro usando o qualificador de glob om ( o rder by m ):

 % printf '%s\n' JenkinsBackup_*(om)
JenkinsBackup_20170630-095558.tar.gz
JenkinsBackup_20170630-095557.tar.gz
JenkinsBackup_20170630-095556.tar.gz
JenkinsBackup_20170630-095555.tar.gz
JenkinsBackup_20170630-095554.tar.gz
JenkinsBackup_20170630-095553.tar.gz
JenkinsBackup_20170630-095552.tar.gz
JenkinsBackup_20170630-095551.tar.gz
JenkinsBackup_20170630-095550.tar.gz
JenkinsBackup_20170630-095549.tar.gz
JenkinsBackup_20170630-095548.tar.gz
JenkinsBackup_20170630-095547.tar.gz
JenkinsBackup_20170630-095546.tar.gz
JenkinsBackup_20170630-095545.tar.gz
JenkinsBackup_20170630-095544.tar.gz

Relacione por hora de modificação, a primeira mais recente e selecione a partir do dia 11:

 % printf '%s\n' JenkinsBackup_*(om[11,-1])
JenkinsBackup_20170630-095548.tar.gz
JenkinsBackup_20170630-095547.tar.gz
JenkinsBackup_20170630-095546.tar.gz
JenkinsBackup_20170630-095545.tar.gz
JenkinsBackup_20170630-095544.tar.gz

Excluir arquivos correspondentes mais antigos que o 10º mais recente:

 % rm -v JenkinsBackup_*(om[11,-1])
removed 'JenkinsBackup_20170630-095548.tar.gz'
removed 'JenkinsBackup_20170630-095547.tar.gz'
removed 'JenkinsBackup_20170630-095546.tar.gz'
removed 'JenkinsBackup_20170630-095545.tar.gz'
removed 'JenkinsBackup_20170630-095544.tar.gz'

Veja zsh: 14 Expansão: Geração de nome de arquivo

    
por steeldriver 30.06.2017 / 16:07
1

Python

Eu suponho que o diretório contenha somente seus backups. Se houver outros arquivos, os arquivos errados serão excluídos.

import os
for f in sorted(os.listdir('.'))[:-10]:
    os.remove(f)

Explicação

  • os.listdir('.') obtém nomes de arquivos no diretório atual
  • sorted() ordena os nomes dos arquivos em ordem crescente (os mais antigos primeiro)
  • [:-10] seleciona toda a lista, exceto os últimos dez itens
  • os.remove() exclui cada arquivo
por wjandrea 30.06.2017 / 16:49