Você está no caminho certo com sua escolha de ferramentas:
-
ls -t
é uma boa maneira de classificar arquivos ordenados por horário, para que você possa escolher as últimas -
find
é a ferramenta certa para encontrar arquivos que correspondam a algum padrão em diretórios e subdiretórios
A parte complicada do curso é que você precisa de algum tipo de agrupamento por nome de arquivo, e escolha o arquivo mais recente em cada grupo. Por causa desse requisito, Eu acho que você precisa de um loop onde você itera sobre cada nome de arquivo de destino para encontrar sua última versão.
Supondo que os arquivos estejam em $dir1
, $dir2
ou $dir3
,
você poderia escrever uma função para encontrar a versão mais recente de algum padrão como este:
find_latest() {
pattern=$1
ls -t "$dir1/$pattern" "$dir2/$pattern" "$dir3/$pattern" | head -n 1
}
Então, digamos que você tenha os padrões access.log
, error.log
, x*
,
então você pode passar por cima deles assim, por exemplo:
for pattern in access.log error.log 'x*'; do
latest=$(find_latest 'a*')
echo $latest
done
Se a suposição acima não for verdadeira,
e os arquivos podem estar em subdiretórios de $dir1
, $dir2
ou $dir3
,
então você precisa usar find
, fica um pouco mais complexo:
find_latest() {
pattern=$1
find "$dir1" "$dir2" "$dir3" -name "$pattern" -print0 | xargs -0 ls -t | head -n 1
}
Há uma pequena advertência: se um caminho contiver caracteres de nova linha,
essa função não funcionará bem porque a etapa head -n 1
irá cortar a parte do caminho após a nova linha. Eu cruzo meus dedos que você não tem esses caminhos; -)