Вопрос или проблема
Я пишу .sh-скрипт, чтобы он выполнял за меня работу, но сейчас я на том этапе, когда мне нужно выполнить cd в каталог, в котором находится файл /path/to/file.end.
терминал не позволяет
cd /path/to/file.end
bash: cd: /path/to/file.end: Не является каталогом
К сожалению, я не знаю обходных путей, так что было бы здорово, если бы вы могли помочь!
Введите cd $( dirname /path/to/file.end)
. Это перенесет вас в /path/to
.
Объяснение:
dirname
возвращает полный путь к файлу (без имени файла, которое вы получили бы сbasename
) – например,dirname /etc/apt/apt.conf.d/99update-notifier
возвращает/etc/apt/apt.conf.d
- выражение
$(что-либо)
заменяется результатом команды в скобках. Такcd $( dirname /etc/apt/apt.conf.d/99update-notifier)
выполняется какcd /etc/apt/apt.conf.d
Другая (но старая и не рекомендованная) нотация для того же:
cd `dirname /path/to/file.end`
Вы не можете cd
в файл. Вот функция (для командной строки), которая автоматически выполнит cd
в путь для указанного полного пути к файлу:
function fcd () { [ -f "$1" ] && { cd "$(dirname "$1")"; } || { cd "$1"; } ; pwd; }
Если вы добавите “/..” к имени файла, это перенесет вас в правильный каталог, например, cd /path/to/file.end/..
. Это работает, по крайней мере, в Cygwin.
Используйте:
cd $(dirname $(realpath <path>/myfile.txt))
Это раскрывает путь к файлу.
.
Ответ или решение
Перейти в родительский каталог файла с использованием команды cd
— задача, с которой часто сталкиваются многие разработчики при написании скриптов на Bash. Ваша текущая проблема заключается в том, что команда cd /path/to/file.end
не сработает, так как вы пытаетесь переместиться в файл, а не в каталог. Терминал правильно сигнализирует об ошибке "не является каталогом".
Решение проблемы
-
Использование команды
dirname
:
Командаdirname
возвращает имя родительского каталога для данного полного пути файла. Вы можете использовать данную команду для извлечения пути каталога, в котором находится файл:cd $(dirname /path/to/file.end)
- Объяснение: Команда
$(dirname /path/to/file.end)
динамически вычисляет путь каталога и передает его как аргумент командыcd
, тем самым перемещая вас в нужное место.
- Объяснение: Команда
-
Использование команды
realpath
:
Если путь к вашему файлу может содержать символические ссылки, то использованиеrealpath
поможет разрешить их и получить абсолютный путь:cd $(dirname $(realpath /path/to/file.end))
- Объяснение:
realpath
разворачивает полный и канонический путь к файлу, затемdirname
извлекает путь к каталогу, где находится файл.
- Объяснение:
-
Создание функции для автоматизации:
Для повышения удобства можно определить функцию Bash, которая будет автоматически перемещать вас в каталог для переданного пути к файлу:function fcd () { [ -f "$1" ] && { cd "$(dirname "$1")"; } || { cd "$1"; } ; pwd; }
- Объяснение: Функция
fcd
проверяет, является ли аргумент файлом. Если да, то перемещает в его родительский каталог, иначе пытается переместиться в директорию, если аргументом выступает каталог. Затем она выводит текущий путь командойpwd
.
- Объяснение: Функция
-
Альтернативный подход с использованием относительного пути:
Особо экзотический, но иногда рабочий подход — это добавление/..
к пути:cd /path/to/file.end/..
- Объяснение: Например, в Cygwin это позволяет перейти в родительский каталог за счет использования относительных путей и их обработки системой.
Заключение
Перечисленные выше методы дают возможность эффективно и правильно сменить каталог на родительский для указанного пути файла. Они решают данную задачу с использованием различных подходов — от непосредственного применения команд CLI до создания пользовательской функции для улучшения эргономичности скриптов.
Эти методы укореняются на разных уровнях и могут оказаться полезными в написании более изящных и надежных скриптов, что, безусловно, важно для вашего профессионального развития в области IT.