在 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
从:
答案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
在...
两者之间连接和。(这只是为了使缩短更明显,很容易被忽略)。
希望这可以帮助您更接近您想要的解决方案。