Eu dividi o arquivo em partes delimitadas por tabulação para uma análise de nome de arquivo mais confiável e personalizável, depois usei o awk para encontrar a classificação mais alta de cada e relatório. Experimente cada parte do pipeline antes de prosseguir para o próximo!
find DIR -type f <other find criteron> -print |
perl -lne 'print join("\t",(/^(.*?-)(\d+)(\.\w+)$/))' |
awk -F\t '$2 > f[$1] { f[$1]=$2;e[$1]=$3; } END { for (k in f) { print k f[k] e[k] }}' |
xargs cp -t <desination_directory>
O script awk coloca cada nome de arquivo em uma entrada de matriz associada, sempre mantendo a classificação mais alta encontrada. A extensão é armazenada em sua própria matriz. Depois que toda entrada é processada, todas as entradas da matriz são produzidas, uma por linha. A linha xargs cp -t
copia todos os arquivos para o diretório especificado.
Existe outro método que não funcionará muito bem se os números forem maiores que 9 e não forem 0-preenchidos. Esse método classifica os arquivos de forma lexicográfica e, ao analisar a lista, a primeira parte é alterada, o nome do arquivo mais visto é usado. Quando os nomes dos arquivos são assim, não funciona:
file-9.txt
file-10.txt
porque o arquivo-10.txt aparecerá antes do arquivo-9. O script awk acima faz uma comparação numérica.
CAVEAT: Nomes de arquivos com abas e novas linhas causam um estrangulamento.
CAVEAT 2: Se várias extensões por prefixo de nome de arquivo forem possíveis, teremos que fazer alguns ajustes para acertar.