Digamos que eu tenha o caminho de um arquivo, como faço referência ao diretório desse arquivo na linha de comando?

3

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?

    
por Robert Worchtenhaus 28.05.2012 / 21:17

4 respostas

7
cd "$(dirname ~/home/blah/file.zip)"

$( é uma forma de substituição de comando. O Wiki do BashGuide tem boas informações sobre esse processo.

    
por 28.05.2012 / 21:20
3

(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)
    
por 29.05.2012 / 01:47
1

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.

    
por 28.05.2012 / 21:37
0

(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.

    
por 29.05.2012 / 03:00