No bash, se uma variável tiver o valor de um caminho completo para um arquivo (por exemplo, /home/spider/src/myscript.py), você poderá usar a manipulação de variáveis para obter o nome da base e o nome da pasta.
Então, por exemplo:
filepath='/home/spider/src/myscript.py'
filename=${filepath##*/}
echo $filename
myscript.py
path=${filepath%/*}
echo $path
/home/spider/src
Comando Bash builtin read, suporta a leitura de stdin em um array, com a opção -a, para que você possa usar isto:
IFS='$\n' read -d '' -a files < <(find . -name testfile -type f)
As variáveis do array de shell agora contêm todos os arquivos com seu caminho. Usando as construções de manipulação de string de shell anteriores, você pode fazer agora
cd ${files[2]%/*}
Para mudar para o caminho do segundo arquivo.
Algumas notas sobre o comando acima:
- opção -d '' (esteja ciente do espaço entre -d e '') selecione o caractere nulo como delimitador para leitura.
- opção -a, como visto acima, leia a entrada padrão em uma matriz indexada (denominada 'arquivos' neste caso)
- < < (comando) redireciona a saída do comando entre < (e) para a entrada padrão. Isso é útil para leitura, para o qual você não pode canalizar.
- Eu adicionei '-type f' ao comando find, para garantir que você receba apenas arquivos
- Para referência operandos de manipulação de string no bash
- Você pode usar o comando basename (1) e dirname (1), para o mesmo propósito, mas eles geram um novo processo, portanto, são um pouco menos eficientes.