Tente
parent_path=$(echo "$current_path"/ | sed -e "s|[^/]||g" -e "s|/|../|g")
cd "${current_path}" ; ln -s "${parent_path}${parent_file_to_link}"
Isso funciona simplesmente contando as barras em "${current_path}"
.
A profundidade desejada é mais uma que o número de barras
(por exemplo, a profundidade de test/dir/hello
, que contém duas barras, é 3),
então simplesmente adicionamos uma barra: echo "$current_path"/
. Pipe em sed
.
Como estamos manipulando barras, é mais fácil usar um caractere diferente de /
como o delimitador do comando sed
s s
; Eu gosto de usar a barra vertical ( |
).
s|[^/]||g
encontra todos os caracteres que não são slash
e substitui-os por nada.
Em outras palavras, ele exclui todos os caracteres, exceto as barras.
Então, para o valor "${current_path}"
de test/dir/hello
,
nós echo
'd test/dir/hello/
e, em seguida, reduzimos para ///
.
Então s|/|../|g"
muda cada /
para ../
, então acabamos com ../../../
.
Nota: isso pressupõe que "${current_path}"
não tem nenhum excesso (desnecessário) barras nele.
Por exemplo, test/dir//hello
e test/dir/hello/
são logicamente equivalentes a test/dir/hello
,
mas eles contêm um número enganoso de caracteres slash,
o que irá corromper este processo.
P.S. Sempre cite todas as variáveis da shell, a menos que você tenha uma razão para não
e você tem certeza de que sabe o que está fazendo. Usando chaves
(como em ${variable_name}
) não é o equivalente a citar.