Obtenha o arquivo mais recente da estrutura de diretório ano / mês / data / hora

3

Eu armazeno backups de bancos de dados em uma estrutura de diretórios

year/month/day/time/backup_name

um exemplo seria

basics_mini / 2012/11/05/012232 / RATIONAL.0.db2inst1.NODE0000.20110505004037.001 basics_mini / 2012/11/06/012251 / RATIONAL.0.db2inst1.NODE0000.20110505003930.001

observe que o registro de data e hora do arquivo de backup não pode ser usado. Antes de iniciar o teste de automação, a hora do servidor é definida como 5.5.2011

Então, a questão é como eu posso obter o arquivo mais recente se eu passar o "diretório base" ( basics_mini ) para alguma função que eu vou codificar.

Eu preciso restaurar o banco de dados mais novo. Eu faço isso em php, mas gostaria de saber se existe uma solução simples de shell.

    
por Radek 08.11.2012 / 23:45

5 respostas

2
find 'basics_mini' -type f | 
sed 's/.*basics_mini\///' |
sort -t '/' -k1nr -k2nr -k3nr -k4nr |
head -1

Isso localizará os arquivos no diretório de backup e, em seguida, sed removerá o caminho principal (até o year dir). Em seguida, a classificação separará o nome do caminho em '/' e executará uma classificação numérica nos campos 1, 2, 3 e 4, ou seja, ano, mês, dia e hora. Finalmente, head -1 retornará a linha superior de saída.

É claro que isso só retornará 1 arquivo, mesmo se houver várias novas entradas idênticas (se isso for uma preocupação para você).

    
por 09.11.2012 / 01:15
4

encontrar deve atender às suas necessidades:

find "/path/to/backup_dir" -type f|sort -r|head -n1

Isso só funciona se você tiver (como no seu exemplo) zeros iniciais em suas pastas de mês e dia

Se você quiser um backup com um nome de arquivo específico (ou padrão), adicione um padrão de nome aos parâmetros de localização, por exemplo,

find "/path/to/backup_dir" -type f -name "*db2inst1*"|sort -r|head -n1

... ou use -iname para padrões insensitivos a maiúsculas e minúsculas

Agora, os detalhes dos comandos acima:

  • find "/path" recursivamente lista todos os arquivos / dirs no caminho fornecido (a menos que você use filtragem adicional:
  • o parâmetro -type f de encontrar filtra tudo o que não é um arquivo normal)
  • -name ou -iname correspondem a arquivos de acordo com um padrão específico
  • sort classifica a saída na ordem inversa ( -r )
  • head -n1 apenas imprime a primeira linha ( -n 1 ) de sua entrada e sai imediatamente após fazer isso.
por 09.11.2012 / 00:03
2

Com este esquema de nomenclatura, o backup mais recente está no último subdiretório em ordem lexicográfica. Você pode obter o diretório mais recente diretamente no shell, aproveitando o fato de que os curingas são expandidos em ordem lexicográfica.

cd basics_mini
set [0-9][0-9][0-9][0-9]/*/*/*
shift $(($#-1))
echo "The most recent backup is in $1"

No zsh, você pode obter diretamente o último diretório com um qualificador glob.

echo "The most recent backup is in" basics_mini/[0-9][0-9][0-9][0-9]/*/*/*([-1])
    
por 11.11.2012 / 02:03
1

Minha solução seria usar isso. Ele irá mostrar o mais novo arquivo possível:

ls -lcR --full-time | grep '^-' | sort -k 6 -r | head -n 1

Explicação:

ls -lcR

-l usa um formato de listagem longo

-c show ctime (hora da última modificação das informações de status do arquivo)

-R list subdiretórios recursivamente

grep para arquivos que começam com - (traço), significando 'arquivos regulares'.

sort -k 6 -r

-k Classificar pela coluna n (6, pois isso mantém o campo de data)

-r invertida

head -n1

-n número de linhas a exibir (de cima para baixo. 1)

    
por 09.11.2012 / 01:25
-1
find -maxdepth 1 -type ['d' for directory or 'f'for file] | ls -t | head -1 .. 

Isso deve funcionar.

    
por 27.02.2014 / 19:03