Em um shell padrão:
$ path=/aaa/bbb/ccc/ddd/eee/fff.txt
$ tail="${path#/*/*/}"
$ head="${path%/$tail}"
$ echo "$head" "$tail"
/aaa/bbb ccc/ddd/eee/fff.txt
"${path#/*/*/}"
é o valor de path
, mas a parte principal (mais curta) corresponde a /*/*/
removed, ou seja, a parte final. Então "${path%/$tail}"
é path
com uma barra e a parte da cauda removida.
Isso produzirá resultados quebrados se o caminho não tiver componentes suficientes, então você pode querer verificar isso primeiro.
Como alternativa, no Bash, podemos usar uma correspondência de expressão regular em [[ .. ]]
e selecionar peças correspondentes:
$ if [[ $path =~ (/[^/]+/[^/]+)/(.*) ]]; then
echo "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}"
fi
/aaa/bbb ccc/ddd/eee/fff.txt
[[ ... ]]
funciona como uma condição, por isso é simples usar um if
aqui para garantir que o caminho tenha componentes suficientes.