Como ordenar nomes de arquivos contendo um sufixo numérico inconsistente usando o bash

0

Eu preciso criar um script bash em uma caixa linux (centos 7) para classificar alguns arquivos usando o número que está no início do nome do arquivo e depois salvá-lo em uma variável de lista para que eu possa corresponder ao arquivo completo nome para um número que o usuário é solicitado a inserir quando o script é executado.

No entanto, os arquivos são nomeados de maneira inconsistente.

A primeira parte do nome do arquivo é um número e a segunda parte é o texto, no entanto, alguns dos arquivos têm um. (período / ponto final) separando a parte do número do nome do arquivo e a parte do texto, e outros não, e alguns têm zeros à esquerda e outros não, por exemplo:

001file.txt
2.file.txt
03file.txt
022.file.txt
28file.txt 

No começo eu estava pensando que eu poderia precisar usar expressões regulares para executar a classificação desses arquivos, mas foi apontado para mim que isso não funcionaria, pois os nomes dos arquivos são irregulares, então eu estou querendo saber se há um construído na função dentro de bash que eu seria melhor usar ...

Qualquer conselho ou ponteiros seria muito apreciado ...

    
por Mark Smith 01.08.2018 / 00:52

1 resposta

0
#!/bin/bash

# declare the arrays for the files and the sorting
declare -A files
declare -A sorting

# get a list of filenames into it, saving number without 0's as key
for file in *; do
    fnum=$(echo "$file" | tr -d -c 0-9 | sed 's/^0*//')
    files[$fnum]="$file"
    sorting[$fnum]=$fnum
done

# sort the array by its numeric key values
IFS=$'\n' sorted=($(sort -n <<<"${sorting[*]}"))
unset IFS

# check for user input and if its numerical
if [[ $1 =~ ^-?[0-9]+$ ]]; then
    # iterate through the array
    for i in "${sorted[@]}"; do
        # only handle files above user input number
        if [[ $i -gt $1 ]]; then
            # execute your sql here, echo is just for debugging
            echo ${files[$i]}
        fi
    done
else
    echo "Please supply a number as argument"
    exit 1
fi

Este script está salvando todos os arquivos no diretório atual em uma matriz associativa, usando o número no arquivo como a chave de cada item e o nome do arquivo correspondente como seu valor. Observe que tr extrai TODOS os números do nome do arquivo, portanto, 02.test.3.txt se tornaria 23 . Zeros à esquerda estão sendo ignorados.

Usando seus arquivos como testes em uma pasta e executando o script como ./test.sh 2 , isso gera:

03file.txt
022.file.txt
28file.txt
    
por 01.08.2018 / 03:04