Ir para o diretório de um caminho de arquivo

0

Existe uma maneira pela qual um comando cd pode aceitar um caminho de arquivo regular e pular para o diretório onde o arquivo reside?

Imagem que você pode fazer: vim /usr/share/drupal7/sites/all/modules/legacy/legacy.module cd <alt>+<.> # for last command argument git add <alt>+<.>

adoraria isso

    
por ptica 06.03.2015 / 10:02

5 respostas

1

Aqui está uma abordagem que é um pouco menos de digitação, mas você precisa ser um pouco cuidadoso com isso. Envolve a referência do histórico !$ (que jcbermu também usou), que significa a última palavra do comando mais recente. (Isso está disponível na maioria dos shells: definitivamente bash , csh e tcsh .) Anexe o modificador :h para remover um componente de nome de arquivo à direita, deixando apenas o h ead, e seu comando é cd !$:h .

Nos exemplos a seguir, o texto em negrito é o que você digita:

~ $ vim /usr/share/drupal7/sites/all/modules/legacy/legacy.module
                (edit the file)
~ $ cd !$:h
cd /usr/share/drupal7/sites/all/modules/legacy
/usr/share/drupal7/sites/all/modules/legacy $

Ele pode manipular espaços no nome do diretório, até um ponto:

~ $ vim /usr/share/drupal7/sites/all/modules/old\ code/legacy.module
                (edit the file)
~ $ cd !$:h
cd /usr/share/drupal7/sites/all/modules/old\ code
/usr/share/drupal7/sites/all/modules/old code $

ou

~ $ vim /usr/share/drupal7/sites/all/modules/"old code"/legacy.module
                (edit the file)
~ $ cd !$:h
cd /usr/share/drupal7/sites/all/modules/"old code"
/usr/share/drupal7/sites/all/modules/old code $

Mas, eu acho que uma boa declaração geral é que ele falhará se o último / no nome do arquivo for citado:

~ $ vim "/usr/share/drupal7/sites/all/modules/old code/legacy.module"
                (edit the file)
~ $ cd !$:h
cd "/usr/share/drupal7/sites/all/modules/old code
> Ctrl+C        (Shell asks for continuation text
                    because it sees an unmatched quote character.)

Ele também falhará se o arquivo estiver no diretório atual:

~ $ vim legacy.module
        (edit the file)
~ $ cd !$:h
cd legacy.module
-bash: cd: legacy.module: No such file or directory
~ $                 (:h has no effect because !$ doesn’t contain a /)

mas isso é trivial. Se o arquivo estiver no diretório atual, você simplesmente não fará o cd . Outro problema seria se você colocasse o nome do arquivo em uma variável:

~ $ fn=/usr/share/drupal7/sites/all/modules/legacy/legacy.module
~ $ vim "$fn"
        (edit the file)
~ $ cd !$:h
cd "$fn"
-bash: cd: /usr/share/drupal7/sites/all/modules/legacy/legacy.module: Not a directory
~ $                 (:h has no effect because !$ (which is "$fn") doesn’t contain a /)

Você pode lidar com isso da seguinte maneira:

~ $ fn=/usr/share/drupal7/sites/all/modules/legacy/legacy.module
~ $ vim 
        (edit the file)
~ $ cd "${fn%/*}"
/usr/share/drupal7/sites/all/modules/legacy $

Como as outras respostas sugeriram, use . ou "$PWD" para o comando git add .

    
por 08.03.2015 / 09:00
1

Dois passos:

Crie um script de shell "cdfile" contendo cd "$(dirname "$1")" , torne-o executável e coloque-o em algum lugar, onde ele será encontrado.

Agora use

vim /usr/share/drupal7/sites/all/modules/legacy/legacy.module
cdfile <alt>+<.> # for last command attribute
git add .
    
por 06.03.2015 / 10:06
0

Existe uma maneira de extrair o nome do diretório do nome do arquivo, ele é chamado de dirname

cd 'dirname /your/file/path'
    
por 06.03.2015 / 10:06
0

Usando dirname e !$ :

vim /usr/share/drupal7/sites/all/modules/legacy/legacy.module
cd "$(dirname !$)" 
git add "$PWD"
    
por 06.03.2015 / 10:25
0

Aqui está uma maneira rápida e suja de cd para um diretório binário ...

> cd "$(dirname "'which bash'")"
    
por 25.04.2017 / 20:06

Tags