Indo para o diretório pai de um arquivo com cd?

9

Estou escrevendo um .sh para fazer algum trabalho para mim, mas agora estou no ponto em que preciso cd para o diretório em que o arquivo /path/to/file.end está. O terminal não permite

cd /path/to/file.end
bash: cd: /path/to/file.end: Not a directory

infelizmente não há nenhuma solução alternativa que eu conheça, por isso seria bom se você pudesse ajudar!

Azsgy
fonte
4
Você quer dizer cd /path/to? Isso vai mudar o diretório para o diretório que o arquivo file.endestá em.
Alaa Ali
11
Não, o arquivo é variável, e eu gostaria de entrar no caminho do arquivo (solte-o no terminal) e, em seguida, vá para a pasta que está em
Azsgy

Respostas:

10

Digite cd $( dirname /path/to/file.end). Isso vai levar você para dentro /path/to.

Explicação:

  • dirnameretorna o caminho completo para um arquivo (sem o nome do arquivo que você escolheria basename) - ou seja, dirname /etc/apt/apt.conf.d/99update-notifierretorna/etc/apt/apt.conf.d
  • a expressão $(anything)é substituída pelo resultado do comando entre parênteses. Então cd $( dirname /etc/apt/apt.conf.d/99update-notifier)é executado comocd /etc/apt/apt.conf.d

Outra notação (mas antiga e desanimada) para o mesmo foi

cd `dirname /path/to/file.end` 
Guntbert
fonte
8

Você não pode cdentrar em um arquivo. Aqui está uma (linha de comando) função que automaticamente cdem um caminho para um determinado caminho do arquivo completo:

function fcd () { [ -f "$1" ] && { cd "$(dirname "$1")"; } || { cd "$1"; } ; pwd; }
Rinzwind
fonte
Eu entendi direito ?: function fcd () {[-f $ 1] && {cd $ (/ file.end $ 1); } || {cd $ 1; } pwd} a resposta é: bash: erro de sintaxe próximo ao token inesperado `pwd ', isso me dá um erro da seguinte maneira :(
Azsgy
2
@ Atsch, precisa de um ponto pwde vírgula antes e, se você estiver definindo uma função em uma linha, precisará de um ponto e vírgula depois pwd.
Glenn Jackman
@glennjackman a função apenas sai sem qualquer saída ou mudança de dir :(
Azsgy
execute a função e digite echo $?- qual é o status de saída?
Glenn Jackman
caramba, eu não deveria ter duvidado de mim mesmo. A alternativa parecia melhor para mim quando eu achei _O-
Rinzwind
1

Se você anexar "/ .." ao nome do arquivo que o levará ao diretório correto, por exemplo cd /path/to/file.end/... De qualquer maneira, funciona no Cygwin.

cérebro
fonte
4
Não funciona no bash;) touch test && cd /home/test/test/..diz:bash: cd: /home/test/test/..: No such file or directory
Rinzwind