Переход в родительский каталог файла с помощью cd?

Вопрос или проблема

Я пишу .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 не сработает, так как вы пытаетесь переместиться в файл, а не в каталог. Терминал правильно сигнализирует об ошибке "не является каталогом".

Решение проблемы

  1. Использование команды dirname:
    Команда dirname возвращает имя родительского каталога для данного полного пути файла. Вы можете использовать данную команду для извлечения пути каталога, в котором находится файл:

    cd $(dirname /path/to/file.end)
    • Объяснение: Команда $(dirname /path/to/file.end) динамически вычисляет путь каталога и передает его как аргумент команды cd, тем самым перемещая вас в нужное место.
  2. Использование команды realpath:
    Если путь к вашему файлу может содержать символические ссылки, то использование realpath поможет разрешить их и получить абсолютный путь:

    cd $(dirname $(realpath /path/to/file.end))
    • Объяснение: realpath разворачивает полный и канонический путь к файлу, затем dirname извлекает путь к каталогу, где находится файл.
  3. Создание функции для автоматизации:
    Для повышения удобства можно определить функцию Bash, которая будет автоматически перемещать вас в каталог для переданного пути к файлу:

    function fcd () { [ -f "$1" ] && { cd "$(dirname "$1")"; } || { cd "$1"; } ; pwd; }
    • Объяснение: Функция fcd проверяет, является ли аргумент файлом. Если да, то перемещает в его родительский каталог, иначе пытается переместиться в директорию, если аргументом выступает каталог. Затем она выводит текущий путь командой pwd.
  4. Альтернативный подход с использованием относительного пути:
    Особо экзотический, но иногда рабочий подход — это добавление /.. к пути:

    cd /path/to/file.end/..
    • Объяснение: Например, в Cygwin это позволяет перейти в родительский каталог за счет использования относительных путей и их обработки системой.

Заключение

Перечисленные выше методы дают возможность эффективно и правильно сменить каталог на родительский для указанного пути файла. Они решают данную задачу с использованием различных подходов — от непосредственного применения команд CLI до создания пользовательской функции для улучшения эргономичности скриптов.

Эти методы укореняются на разных уровнях и могут оказаться полезными в написании более изящных и надежных скриптов, что, безусловно, важно для вашего профессионального развития в области IT.

Оцените материал
Добавить комментарий

Капча загружается...