Raccourcir automatiquement les chemins dépassant la limite du nombre de caractères dans bash

1

Windows et les outils fonctionnant sur des serveurs Windows (par exemple, OneDrive) ont une limite de longueur de chemin.

Je recherche un outil de ligne de commande sous OSX / Linux / Unix pour, dans un répertoire, raccourcir tous les chemins dépassant un seuil, par exemple, en conservant les 5 premiers caractères et les 5 derniers caractères de chaque nom de dossier / fichier. des chemins trop longs, commençant par les noms des dossiers et des fichiers les plus éloignés de la racine (c'est-à-dire les plus imbriqués).

c'est à dire

folder_very_very_long_name/folder_very_very_long_name/folder_very_very_long_name/file_very_very_long_name

pourrait devenir

folder_very_very_long_name/folder_very_very_long_name/folde_name/file__name

Je peux déjà identifier les chemins gênants en utilisant:

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

de:

https://discussions.apple.com/thread/2590442?tstart=0

Etienne Low-Décarie
la source
Que voulez-vous qu'il se passe s'il folder_very_very_long_name/folder_very_very_long_name/folde_name/file__nameexiste déjà?
Andrew Morton

Réponses:

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

Exemple de sortie:

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

Explication:

IFSest votre délimiteur; vous lisez lpet stockez chaque partie de votre chaîne fractionnée dans le tableau components.

Ensuite, vous parcourez chaque élément de votre tableau en utilisant l'instruction if pour vérifier si l'élément respectif compest vide, indiquant ainsi un chemin commençant à la racine. L' utilisation que cutvous obtenez les 5 premiers caractères et en utilisant tailla dernière 5. vous ajoutez ensuite que sur votre chemin ensemble combined_path, concaténer aet bavec ...entre les deux. (C'est juste pour rendre le raccourcissement plus visible et peut facilement être laissé de côté).

J'espère que cela vous aidera à vous rapprocher de la solution souhaitée.

lo2ndii
la source