1

Windows и инструменты, работающие на серверах Windows (например. OneDrive) имеют ограничение на длину пути.

Я ищу инструмент командной строки в OSX/Linux/Unix, чтобы в каталоге сократить все пути выше порога длины пути, например, сохранив первые 5 символов и последние 5 символов каждой папки / имени файла в слишком длинные пути, начиная с имен папок и файлов, наиболее удаленных от корня (то есть наиболее вложенных).

т.е.

folder_very_very_long_name/folder_very_very_long_name/folder_very_very_long_name/file_very_very_long_name

мог стать

folder_very_very_long_name/folder_very_very_long_name/folde_name/file__name

Я уже могу определить проблемные пути, используя:

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

от:

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

1 ответ1

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

Пример вывода:

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

Объяснение:

IFS - ваш разделитель; вы читаете в lp и сохраняете каждую часть вашей разделенной строки в components массива.

Затем вы выполняете итерацию по каждому элементу в вашем массиве, используя оператор if, чтобы проверить, является ли соответствующий comp пустым, тем самым указывая путь, начинающийся с корня. Используя cut вы получите первые 5 символов, а tail - последние 5. Затем вы добавляете это к вашему общему пути combined_path , объединяя a и b с ... между ними. (Это просто для того, чтобы сделать укорочение более заметным, и его легко можно пропустить).

Надеюсь, что это поможет вам приблизиться к желаемому решению.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .