Есть ли способ, с помощью которого команда cd может принять обычный путь к файлу и перейти в каталог, где находится файл?

Изображение, которое вы можете сделать: vim /usr/share/drupal7/sites/all/modules/legacy/legacy.module cd <alt>+<.> # for last command argument git add <alt>+<.>

хотел бы это

5 ответов5

1

Два шага:

Создайте скрипт оболочки "cdfile", содержащий cd "$(dirname "$1")" , сделайте его исполняемым и поместите его где-нибудь, где он будет найден.

Сейчас использую

vim /usr/share/drupal7/sites/all/modules/legacy/legacy.module
cdfile <alt>+<.> # for last command attribute
git add .
1

Вот подход, который немного меньше набирает, но вы должны быть немного осторожнее с ним.  Это включает в себя !$ history reference (которую также использовал jcbermu), что означает последнее слово самой последней команды.  (Это доступно в большинстве оболочек: определенно bash , csh и tcsh .)  Добавьте :h , чтобы удалить компонент имени трейлинга файла, оставляя только ч EAD, и ваша команда cd !$:h

В следующих примерах жирный текст - это то, что вы вводите:

~ $ 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 $

Он может обрабатывать пробелы в имени каталога, вплоть до точки:

~ $ 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 $

или же

~ $ 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 $

Но, я думаю, что хорошее общее утверждение состоит в том, что он терпит неудачу, если последний / в имени файла указан в кавычках:

~ $ 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.)

Он также не работает, если файл находится в текущем каталоге:

~ $ 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 /)

но это тривиально  Если файл находится в текущем каталоге, вы просто не будете делать cd вообще.  Другая проблема будет, если вы поместите имя файла в переменную:

~ $ 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 /)

Вы можете справиться с этим следующим образом:

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

Как предложили другие ответы, используйте . или "$PWD" для команды git add .

0

Есть способ извлечь имя каталога из имени файла, это называется dirname

cd `dirname /your/file/path`
0

Вот быстрый и грязный способ перейти на cd в бинарный каталог ...

> cd "$(dirname "`which bash`")"
0

Используя dirname и !$:

vim /usr/share/drupal7/sites/all/modules/legacy/legacy.module
cd "$(dirname !$)" 
git add "$PWD"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .