Eu tenho um caminho explícito para um arquivo:
/aaa/bbb/ccc/ddd/eee/fff.txt
Eu preciso cd /aaa/bbb
e realizar uma operação em ccc/ddd/eee/fff.txt
.
Consegui entender a primeira parte:
df_test=/aaa/bbb/ccc/ddd/eee/fff.txt
cd $( echo ${df_test} | awk -F/ '{print "/"$2"/"$3}' )
Como eu corto os dois primeiros passos no caminho e opero no restante? Além disso, não saberei com antecedência a profundidade desses arquivos. talvez eu tenha
/aaa/bbb/ccc/ddd.txt
/aaa/bbb/ccc/ddd/eee/fff.txt
/aaa/bbb/ccc/ddd/eee/fff/ggg/hhh/iii.txt
Eu só preciso mudar os diretórios para /aaa/bbb e operar no caminho relativo restante.
Em um shell padrão:
"${path#/*/*/}"
é o valor depath
mas com a (mais curta) correspondência da parte inicial/*/*/
removida, ou seja, sua parte da cauda. 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, portanto, convém verificar isso primeiro.
Alternativamente, no Bash, podemos usar uma correspondência de expressão regular dentro
[[ .. ]]
e pegar as peças correspondentes:[[ ... ]]
funciona como uma condição, então é simples usar umif
here para garantir que o caminho tenha componentes suficientes.Pessoalmente, eu gosto
cut
disso:Você simplesmente tem que ajustar o
-f
argumento com a profundidade que deseja analisar na árvore de diretórios.Isso mostra como se livrar dos primeiros dois campos usando
awk
:Dado que o prefixo é estático, você pode usar a expansão de parâmetros para removê-lo: