Как в Bash узнать абсолютный путь до файла
Абсолютный путь содержит полный перечень папок, в которых находится файл, начиная от корня файловой системы.
Пример абсолютного пути: /home/mial/bin/myfile.txt
Преимущество абсолютного пути в том, что используя его можно обратиться к файлу из любой папки системы.
Относительный путь указывает на расположение файла относительно текущей папки. Примеры относительных путей:
- myfile.txt
- ./myfile.txt
- bin/myfile.txt
- ../../bin/myfile.txt
Преимущество относительного пути в том, что обычно он обозначается более короткой записью как например myfile.txt — означает одноимённый файл в текущей папке. Очевидно, что при смене рабочей директории относительный путь до файла станет другим.
В этой заметке будут рассмотрены несколько примеров того, как определить абсолютный путь до файла в текущей рабочей директории или любой другой, когда путь до файла указан как относительный путь.
realpath
Первый вариант — использовать команду realpath:
Привет вывода абсолютного пути:
Эта программа является частью coreutils.
По умолчанию эта программа преобразует символические ссылки (опция -P) и показывает расположение файла даже если он не существует (опция -m) — то есть эти опции указывать необязательно.
Фактически, по умолчанию работа программы сводится к тому, что к указанному аргументу она добавляет текущую рабочую папку, то есть можно узнать абсолютный путь даже до файла, который не существует:
Если вас это не устраивает, то используйте опцию -e — тогда если указанный файл не существует, то вместо вывода абсолютного пути будет показано сообщение об ошибке.
readlink
Аналогичную функцию выполняет и команда readlink.
Если вы хотите показать абсолютный путь только для существующих файлов, то используйте опцию -e:
Если вас не волнует, существует ли файл, то используйте опцию -f (не требует существование последнего компонента) или опцию -m (не требует существование какого-либо компонента пути):
realpath и readlink не найдены
UNIX системы — это не только многочисленные дистрибутивы Linux. В некоторых из них команды realpath и readlink могут отсутствовать. Если они отсутствуют и вы не хотите или не можете устанавливать дополнительные бинарные файлы, то выход всё равно есть.
Создайте файл, например, realpath.sh и скопируйте в него:
Этот же вариант в виде функции:
Вот эта же функция в продвинутом варианте — дополнительно обрабатывает ситуацию, когда директория не существует, а также если во вводе присутствуют '..' или '.'
Ещё один вариант в виде функции оболочки, который:
- не требует утилит (только cd и pwd)
- работает для директорий и файлов
- обрабатывает .. и .
- обрабатывает пробелы в директориях и именах файлов
- требует, чтобы файл или директория существовали
- ничего не возвращает, если ничего не существует
- может принимать абсолютные пути в качестве ввода (хотя ничего с ними не делает)
И ещё одна функция, записанная в одну строку и работающая в bash и zsh (другие не проверялись):
Может работать с несуществующими файлами.
Связанные статьи:
-
(50%) (50%) (50%) (50%) (50%) (RANDOM — 50%)
Рекомендуемые статьи:
2 Комментарии
Зачем использовать какие-то скрипты с pwd, readlink или realpath для ТЕКУЩЕЙ директории, если можно просто использовать pwd.
Или просто прочитай глобальную переменную $PWD:
Вдумайся, что такое ТЕКУЩАЯ директория! Это просто значение в переменной $PWD! "cd /home" и PWD='/home' это ОДНО И ТОЖЕ! Просто абстракция, благодаря которой ты думаешь, что "переходишь" из директории в директорию. А теперь включи мозг, и сообрази, как узнать путь к запускаемому скрипту, если запускаешь его не из ТЕКУЩЕЙ директории, а из, примеру, соседней?
Во-первых, вам надо что-то делать со своей манерой общения: даже если вы считаете себя самым умным и считаете что много знаете, разговаривать в таком тоне с вами никто не обязан.
А вы далеко не самый умный — показанные способы подходят на все случаи жизни, в том числе, когда получаем путь для файла, который является ссылкой. С помощью pwd или переменной это не сработает.
И самое главное, pwd не поможет, если нужно получить абсолютный путь не просто для файла в текущей папке, а для относительного пути (например, ../../bin/myfile.txt), а методы в статье предназначены именно для таких ситуаций, чтобы любые относительные пути преобразовывать в абсолютные.
Следующее отличие — если мы просто будем добавлять к имени файла вывод команды pwd, то мы никогда не узнаем, существует ли этот файл на самом деле или нет. В статье рассмотрены оба варианта: когда в случае отсутствия файла будет или не будет возвращена ошибка.
Ну и так далее. Ваш комментарий нелеп. Видимо, вы даже не понимаете, о чём говорится в статье.
Как узнать полный путь до текущей директории в Ubuntu?
![]()
Кроме команды pwd можно использовать переменную окружения $PWD , которую определяют большинство интерпретаторов командной строки ( bash , dash , tcsh и даже busybox sh ) и изменяют её динамически при смене каталогов:
![]()
![]()
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.3.13.43306
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Путь к файлу в Linux
Все файлы в Linux имеют определенный адрес в файловой системе, с помощью которого мы можем получить к ним доступ с помощью файлового менеджера или консольных утилит. Это довольно простая тема, но у многих новичков с этим возникают трудности.
В сегодняшней небольшой заметке мы рассмотрим что такое путь к файлу Linux, каким он может быть, как правильно его писать и многое другое. Если раньше у вас возникали с этим трудности, то после прочтения статьи все станет полностью понятно.
Пути файлов в Linux
Файловая система Linux очень сильно отличается от Windows. Мы не будем рассматривать ее структуру, это было сделано ранее. Мы сосредоточимся на работе с файлами.
Самое главное отличие, в том что адрес файла начинается не с диска, например, C:\ или D:\ как это происходит в Windows, а с корня, корневого системного каталога, к которому подключены все другие. Его адрес — /. И тут нужно сказать про адреса. Пути файлов linux используют прямой слеш «/» для разделения каталогов в адресе, и это отличается от того, что вы привыкли видеть в Windows — \.
Например, если в Windows полный путь к файлу на рабочем столе выглядел C:\Users\Sergiy\Desktop\ то в путь файла в linux будет просто /home/sergiy/desktop/. С этим пока все просто и понятно. Но проблемы возникают дальше.
В операционной системе Linux может быть несколько видов путей к файлу. Давайте рассмотрим какие бывают пути в linux:
- Полный, абсолютный путь linux от корня файловой системы — этот путь вы уже видели в примере выше, он начинается от корня «/» и описывает весь путь к файлу;
- Относительный путь linux — это путь к файлу относительно текущей папки, такие пути часто вызывают путаницу.
- Путь относительно домашний папки текущего пользователя. — путь в файловой системе, только не от корня, а от папки текущего пользователя.
Рассмотрим теперь подробнее как выглядят эти пути в linux, а также разберем несколько примеров, чтобы было окончательно понятно. Для демонстрации будем пользоваться утилитой ls, которая предназначена для просмотра содержимого каталогов.
Например, у нас есть такой каталог в домашней папке с четырьмя файлами в нем:

Вот так будет выглядеть полный путь linux к одному из файлов:

Это уже относительный путь linux, который начинается от домашней папки, она обозначается
Основы навигации в Linux
Первая команда, которую мы изучим — pwd , сокращение от Print Working Directory (выведи рабочую директорию). Вы скоро увидите, что множество команд в Linux — это аббревиатуры слов, описывающих их. Это помогает лучше их запомнить. Собственно, команда и выводит текущую рабочую директорию. Попробуйте использовать ее.
Правильное выполнение многих команд терминала зависит от того, в нужном ли месте вы находитесь. Почаще используйте эту команду, чтобы не забывать, в какой вы директории.
Как узнать содержимое директории
Мы научились определять, в какой директории мы находимся. Теперь давайте научимся узнавать содержимое директории. В этом нам поможет команда ls — сокращение от list (список). Давайте опробуем ее.
Команда pwd отрабатывает сама по себе, без аргументов. ls в этом плане посильнее. В случае выше мы запустили ее без аргументов — она выведет список содержимого данной директории. Но от ls можно получить больше — ниже дана схема ее использования:
В примере выше квадратные скобки обозначают, что эти пункты опциональны, и мы можем запускать команду и с ними, и без них. Ниже я запустил разные варианты ls , чтобы продемонстрировать ее работу.
Рассмотрим код по частям:
- Строка 1 — запуск ls в базовой форме. Она вывела список содержимого текущей директории.
- Строка 4 — запуск ls с ключом -l , который означает, что команда выведет длинный список. В длинном списке есть следующее:
- Первый символ означает, является ли объект файлом — или директорией d .
- Следующие 9 символов — типы разрешений для файла или директории.
- Следующее поле — количество блоков (пока что не задумывайтесь об этом).
- Дальше — владелец файла или директории (в данном случае — karpaff)
- Дальше — группа, которой принадлежит файл или директория (в данном случае — users).
- Следующая часть — размер файла/директории.
- Затем идет время изменения.
- И в конце — название файла или директории.
Пути к файлам
При рассмотрении предыдущих команд мы затронули тему путей. Я хотел бы углубиться в эту тему, поскольку она важна для более эффективного использования Linux. Неважно, пытаемся мы обратиться к файлу или директории через командную строку, на самом деле мы обращаемся по пути. Путь — это способ добраться до конкретного файла или директории в системе.
Абсолютные и относительные пути
Существует два типа путей — абсолютные и относительные. Обращаемся мы к файлу или директории, мы будем использовать один из этих типов путей (система в любом случае будет направлена в правильное место).
Для начала нужно понять, что файловая система под Линуксом — это иерархическая структура. Наверху этой структуры находится корневая директория. Она обозначается одним слэшем / . У нее есть свои поддиректории, у них свои и так далее. Файлы могут находиться в любой из директорий.
Абсолютные пути указывают положение файла или директории относительно директории root . Их можно узнать по слэшу в начале пути / .
Относительные пути указывают положение файла или директории относительно ващего текущего местоположения в системе. Они не начинаются со слэша.
Пример:
- Строка 1 — запускаем pwd , чтобы узнать, где мы находимся.
- Строка 4 — запускаем ls с аргументом в виде относительного пути. Documents — директория в той папке, в которой мы сейчас находимся. Такая команда может выдать разный результат в зависимости от того, где мы находимся. Если бы у нас был другой пользователь в системе, скажем, Вася, и мы запустили бы эту команду в его домашней директории, выводом стало бы содержимое папки Documents Васи.
- Строка 7 — запускаем ls с аргументом в виде абсолютного пути. Вывод такой команды будет одинаков вне зависимости от того, где мы сейчас находимся.
Скоро вы увидите, что множество вещей в Linux можно получить несколькими разными способами. Пути — не исключение. Ниже приведены некоторые иные компоненты для построения путей.
(тильда) — обозначение вашей домашней директории. Например, если ваша домашняя директория /home/karpaff, то к директории Documents можно обратиться по пути /home/karpaff/Documents или по пути
Теперь вы знаете, что к местоположению можно обращаться множеством разных способов. Некоторые из вас зададутся вопросом, какой вариант лучше использовать? Ответ: любой, который больше нравится. Обращаетесь вы к файлу или директории, в командной строке вы обращаетесь по пути, а путь вы можете составить, используя любой из элементов, представленных выше. Лучший подход в этом деле — удобный именно для вас.
Примеры:
После того, как вы сами поиграетесь с этими командами в командной строке, вы станете лучше их понимать. Убедитесь, что понимаете, как работают элементы построения пути, поскольку мы будем использовать их в следующих уроках.
Как сменить директорию
Для передвижения по системе используется команда cd , сокращение от change directory (сменить директорию). Она работает следующим образом:
Подсказка: если вы запустите команду без аргументов, она вернет вас в домашнюю директорию.
Команду cd можно запускать и без аргументов, как мы видели в подсказке выше, но обычно ее запускают с одним аргументом командной строки — месту, в которое мы хотим перейти. Место определяется абсолютным или относительным путем с использованием любых элементов для построения путей, упомянутых выше.
Пример:
Автодополнение
Прописывать пути вручную может быть утомительно. А если вы, как и я, постоянно опечатываетесь, то вам очень поможет маленький механизм командной строки под названием автодополнение.
Когда вы печатаете путь в командной строке, нажмите кнопку Tab, чтобы применить механизм автозавершения. Если ничего не произошло, значит существует несколько вариантов продолжения пути. Нажмите Tab снова, и вы увидите эти варианты. Продолжайте печатать и опять нажмите Tab, и механизм снова попытается завершить путь за вас.
Это сложно продемонстрировать в статье, так что попробуйте потестировать эту фичу сами. Если вы напечатаете в командной строке cd /hTab/<начало вашего имени пользователя>Tab, вы поймете, как это работает.
Что нужно запомнить
Команды
pwd
Выводит текущую директорию.ls
Выводит писок содержимого директории.cd
Переводит в другую директорию.Понятия
Относительный путь
Местоположение файла или директории относительно вашего текущего местоположения в системе.Абсолютный путь
Местоположение файла или директории относительно корневой папки файловой системы.Практические задания
Давайте применим то, что мы только что узнали, на практике. Попробуйте выполнить следующие задания:
1. Начнем с передвижения по системе. Используйте команды cd и ls , чтобы больше узнать о директориях вашей системы и о том, что в них есть. Постарайтесь использовать разные варианты относительных и абсолютных путей. Интересные места для исследования:
• /etc — здесь хранятся конфигурационные файлы системы.
• /var/log — здесь хранятся файлы логов для разных системных программ. (У вас может не быть разрешений просматривать все в этой директории. Пусть это вас не останавливает. Пара сообщений об ошибках никому не помешает)
• /bin — место, в котором хранятся некоторые часто используемые программы.
• /usr/bin — еще одно место, в котором хранятся системные программы.2. А теперь вернитесь в домашнюю директорию 4 разными способами.
3. Постарайтесь почаще использовать автодополнение. Зачем напрягаться, если компьютер может что-то делать за вас?