Encurta automaticamente os caminhos sobre um limite de contagem de caracteres no bash

1

O Windows e as ferramentas executadas em servidores Windows (por exemplo, OneDrive) têm um limite de comprimento de caminho.

Estou procurando uma ferramenta de linha de comando no OSX / Linux / Unix para, dentro de um diretório, encurtar todos os caminhos acima de um limite de comprimento de caminho, por exemplo, mantendo os 5 primeiros caracteres e os últimos 5 caracteres de cada pasta / nome do arquivo em caminhos excessivamente longos, começando com os nomes das pastas e arquivos mais distantes da raiz (ou seja, a maioria dos aninhados).

ou seja

folder_very_very_long_name/folder_very_very_long_name/folder_very_very_long_name/file_very_very_long_name

pode se tornar

folder_very_very_long_name/folder_very_very_long_name/folde_name/file__name

Já posso identificar os caminhos problemáticos usando:

find . -name \* -type f | perl -ne 's/(.*)/print length($1), " $1\n"/e' | sort -nu

de:

link

    
por Etienne Low-Décarie 23.07.2016 / 14:22

1 resposta

1

lp="folder_very_very_long_name/folder_very_very_long_name/folder_very_very_long_name/file_very_very_long_name"

IFS='/' read -a components <<< "$lp"

combined_path=""

for comp in "${!components[@]}"
do
    if [ ${#components[$comp]} -gt 0 ]; then
        a=$(echo ${components[$comp]} | cut -c -5);
        b=$(echo ${components[$comp]} | tail -r -c 6);
        if [ $comp -eq 0 ]; then
            combined_path="$a...$b"
        else
            combined_path="$combined_path/$a...$b"
        fi
    fi
done
echo $combined_path

Exemplo de saída:

folde..._name/folde..._name/folde..._name/file_..._name

Explicação:

IFS é seu delimitador; você lê em lp e armazena cada parte de sua string dividida no array components .

Em seguida, você itera sobre cada elemento em sua matriz, usando a instrução if para verificar se o respectivo comp está vazio, indicando um caminho começando na raiz. Usando cut , você obtém os 5 primeiros caracteres e usa tail o último 5. Em seguida, anexe-o ao seu caminho geral combined_path , concatenando a e b com ... entre os dois. (Isso é apenas para tornar o encurtamento mais visível e pode ser facilmente deixado de fora).

Espero que isso ajude você a se aproximar da solução desejada.

    
por 25.07.2016 / 20:51