在 Bash 中自动缩短超过字符数限制的路径

在 Bash 中自动缩短超过字符数限制的路径

在 Windows 服务器上运行的 Windows 和工具(例如 OneDrive)对路径长度有限制。

我正在寻找 OSX/Linux/Unix 中的命令行工具,以便在目录内缩短路径长度阈值以上的所有路径,例如,保留过长路径中每个文件夹/文件名称的前 5 个字符和后 5 个字符,从距离根目录最远(即嵌套最多)的文件夹和文件的名称开始。

IE

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

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_pathab...两者之间连接和。(这只是为了使缩短更明显,很容易被忽略)。

希望这可以帮助您更接近您想要的解决方案。

相关内容