cd "$(dirname ~/home/blah/file.zip)"
$(
é uma forma de substituição de comando. O Wiki do BashGuide tem boas informações sobre esse processo.
Eu posso digitar:
dirname ~/home/blah/file.zip
por exemplo, e isso funciona bem sozinho, mas quando eu uso essa sintaxe como o parâmetro para algum comando, ele sempre lê 'dirname' como o diretório desejado. ou seja:
cd dirname ~/home/blah/file.zip
bash: cd: dirname: No such file or directory
Basicamente, como faço para que o arquivo 'dirname ' seja lido como uma entidade?
cd "$(dirname ~/home/blah/file.zip)"
$(
é uma forma de substituição de comando. O Wiki do BashGuide tem boas informações sobre esse processo.
(Eu não vou repetir o recurso de substituição de comando já mostrado em outras respostas.)
Se isso ocorrer com frequência, você poderá definir uma função. Por exemplo, coloque isso no seu ~/.bashrc
:
d () {
if ! [ -d "$1/." ]; then
set -- "${1%/*}"
fi
cd -- "$1"
}
Com essa definição, você pode executar d /path/to/directory
para alterar o diretório especificado ou d /path/to/file
para alterar para o diretório que contém o arquivo especificado (por exemplo, /path/to
).
Para este comando em particular, você pode remover a última palavra editando o comando: com as teclas padrão, a partir do final da linha, pressione Alt + B para volte para a palavra anterior e Alt + D para apagar a palavra à direita. Na maioria dos terminais, a partir do final da linha, você pode pressionar Esc Backspace para apagar diretamente a palavra à esquerda.
Se o caminho for um diretório, ~/home/blah/subdir/..
designará o mesmo diretório que ~/home/blah
.
Em zsh, você pode anexar (:h)
no final de um caminho para retirar o nome do arquivo e manter apenas a parte do diretório. (É h
para "cabeça"; t
para "cauda" retém apenas a parte do arquivo.) Você pode usar outros modificadores de histórico dentro de (:…)
após um caminho ou glob.
cd ~/home/blah/file.zip(:h)
A forma "$(cmd)"
recomendada por Chris é mais segura, mas isso é mais fácil de digitar e geralmente funciona da seguinte maneira:
$ cd 'dirname ~/home/blah/file.zip'
A diferença é que os backticks podem ser confundidos por certos personagens no comando está se expandindo. Para um comando simples como o que você mostra, você pode dizer imediatamente que não será um problema. Para um script de shell que precisa aceitar argumentos arbitrários, é mais seguro usar o formulário $()
com aspas duplas.
(Esta é apenas uma resposta para @gilles answer, pois é muito grande para um comentário)
Como Gilles já apontou, você pode criar uma função que execute automaticamente a função necessária. Mas em vez de usar algum nome aleatório, você também pode redefinir apenas cd
:
Para zsh:
cd() {
if (( ${#argv} == 1 )) && [[ -f ${1} ]]; then
builtin cd ${1:h}
else
builtin cd "$@"
fi
}
Para o bash:
cd() {
if [ $# == 1 ] && [[ -f ${1} ]]; then
builtin cd "$(dirname ${1})"
else
builtin cd "$@"
fi
}
Isso permitirá que você faça algo como cd /path/to/file
e ele será automaticamente alterado para o diretório do arquivo específico. Claro que você pode usar a versão bash também com zsh.