Intereting Posts
Как применить du (fx) ко всем вспомогательным каталогам, за исключением некоторых из них? Команда Grep для поиска файлов, содержащих текстовую строку, и перемещения их Любой способ получить уведомление об ошибках EXT4 при установке с помощью "errors = continue" Как освободить последовательный порт, принадлежащий Getty Использование xcape + xmodmap для изменения некоторых ключей Терминальный эмулятор с CTRL + Scroll Zoom Получить список всех файлов по маске в терминале Инкрементальный сценарий резервного копирования (общий хостинг) Возможно ли установить пользовательский Linux на Android-телефоне? Ошибки при запуске моей системы Wheezy Другая учетная запись с тем же uid, что и root, запрашивается, чтобы установить новый пароль для root, а не сам Почему параметр $ 0 дает мне только базовое имя вместо полного пути после преобразования x-shellscript в x-исполняемый? cygwin не может открыть gnome-session Как я могу задать определенный сервер для загрузки Проблема с отображением в бесконечной ОС

Скажем, у меня есть путь к файлу, как я могу ссылаться на каталог этого файла из командной строки?

Я могу печатать:

dirname ~/home/blah/file.zip 

например, и это работает отлично, но когда я использую этот синтаксис как параметр для некоторой команды, он всегда читает «dirname» в качестве нужной директории. то есть:

 cd dirname ~/home/blah/file.zip bash: cd: dirname: No such file or directory 

В принципе, как мне получить файл «dirname» для чтения как одного объекта?

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

$( это форма подстановки команд). У BashGuide Wiki есть хорошая информация об этом процессе.

(Я не буду повторять функцию замены команд, уже показанную в других ответах.)

Если это часто возникает, вы можете определить функцию. Например, поместите это в свой ~/.bashrc :

 d () { if ! [ -d "$1/." ]; then set -- "${1%/*}" fi cd -- "$1" } 

С помощью этого определения вы можете запустить d /path/to/directory чтобы перейти в указанный каталог, или d /path/to/file чтобы перейти в каталог, содержащий указанный файл (например, /path/to ).

Для этой конкретной команды вы можете удалить последнее слово, отредактировав команду: с привязками клавиш по умолчанию, с конца строки, нажмите Alt + B, чтобы вернуться к предыдущему слову, и Alt + D, чтобы стереть слово справа , На большинстве терминалов, начиная с конца строки, вы можете нажать Esc Backspace, чтобы прямо стереть слово слева.

Если путь является каталогом, ~/home/blah/subdir/.. обозначает тот же каталог, что и ~/home/blah .

В zsh вы можете использовать (:h) в конце пути, чтобы удалить имя файла и сохранить только часть каталога. (Это h для «head», t для «tail» сохраняет только часть файла.) Вы можете использовать другие модификаторы истории внутри (:…) после пути или glob.

 cd ~/home/blah/file.zip(:h) 

Форма "$(cmd)" рекомендованная Крисом, безопасна, но ее легче набирать и обычно работает так же хорошо:

 $ cd `dirname ~/home/blah/file.zip` 

Разница в том, что форма обратных шагов может быть смущена определенными символами в команде, которую она расширяет. Для простой команды, подобной той, которую вы показываете, вы можете сразу сказать, что это не будет проблемой. Для сценария оболочки, который должен принимать произвольные аргументы, безопаснее использовать форму с двойными кавычками $() .

(Это всего лишь ответ на ответ @gilles, поскольку он слишком велик для комментария)

Как уже указывал Жиль, вы можете создать функцию, которая автоматически выполняет требуемую функцию. Но вместо того, чтобы использовать какое-то случайное имя, вы также можете просто переопределить cd :

Для zsh:

 cd() { if (( ${#argv} == 1 )) && [[ -f ${1} ]]; then builtin cd ${1:h} else builtin cd "$@" fi } 

Для bash:

 cd() { if [ $# == 1 ] && [[ -f ${1} ]]; then builtin cd "$(dirname ${1})" else builtin cd "$@" fi } 

Это позволит вам сделать что-то вроде cd /path/to/file и оно автоматически изменится в каталог определенного файла. Конечно, вы можете использовать версию bash также с zsh.