Encontre o último arquivo no diretório onde o final do nome do arquivo corresponde a uma string

Encontre o último arquivo no diretório onde o final do nome do arquivo corresponde a uma string

Estou escrevendo um script para criar/copiar arquivos para acelerar o fluxo de trabalho. Neste caso, um diretório precisa ser pesquisado em busca de arquivos que terminem em uma string específica e, se um ou mais forem encontrados, o último na sequência precisa ser direcionado para ser copiado. (Se nenhum for encontrado, o script copia um novo arquivo de um diretório diferente).

Este diretório pode conter vários conjuntos de arquivos que seguem o formato;

YYYYMMDD_##_user_filename.json

Portanto, uma pasta de exemplo pode conter o seguinte;

20161021_01_test_parameters.json
20161021_01_test_stack.json
20161021_02_test_parameters.json
20161021_02_test_stack.json
20161022_03_test_parameters.json
20161025_04_test_parameters.json
20161025_04_test_stack.json

Neste caso, preciso que o script leia qualquer arquivo que termine em parameters.jsone, em seguida, classifique-os com base no número da versão (01, 02, etc) para descobrir qual é o último na sequência. Este arquivo deve então ser copiado para a mesma pasta usando o próximo número de versão. Para este propósito, a data é irrelevante e você pode assumir que nunca haverá números de versão duplicados.

Eu estava usando if [ -e $1/*"parameters.json" ]; then cp $1/*"parameters.json" "$FILENAME"_parameters.json(onde $1está o diretório para o qual esses arquivos estão sendo movidos - importante porque o script está localizado fora dos diretórios nos quais será atuado e $FILENAMEé apenas uma variável para calcular a localização, data, número da versão, etc.), mas de é claro que isso não ajuda em nada a encontrar o mais recente.

Responder1

Como o número pelo qual você deseja classificar parece ser sempre o segundo campo delimitado por sublinhado, você poderá usar algo como

find path/to/dir/ -maxdepth 1 -name '*parameters.json' | sort -t_ -nk2,2 | tail -n1

Se você precisar lidar com a possibilidade de nomes de arquivos que contenham novas linhas, e seus utilitários principais suportarem isso, você pode transformar todo o comando em delimitado por nulo, por exemplo

find path/to/dir/ -maxdepth 1 -name '*parameters.json' -print0 | sort -zt_ -nk2,2 | tail -zn1

informação relacionada