- Как в Bash узнать абсолютный путь до файла
- realpath
- readlink
- realpath и readlink не найдены
- Связанные статьи:
- Рекомендуемые статьи:
- 2 Комментарии
- Как узнать адрес файла на сервере
- Адреса файлов на серверах
- Определение адреса файла на сервере
- Консольная утилита pwd (для Linux)
- Панели управления и FTP
- Создание PHP-скрипта
Как в Bash узнать абсолютный путь до файла
Абсолютный путь содержит полный перечень папок, в которых находится файл, начиная от корня файловой системы.
Пример абсолютного пути: /home/mial/bin/myfile.txt
Преимущество абсолютного пути в том, что используя его можно обратиться к файлу из любой папки системы.
Относительный путь указывает на расположение файла относительно текущей папки. Примеры относительных путей:
Преимущество относительного пути в том, что обычно он обозначается более короткой записью как например myfile.txt — означает одноимённый файл в текущей папке. Очевидно, что при смене рабочей директории относительный путь до файла станет другим.
В этой заметке будут рассмотрены несколько примеров того, как определить абсолютный путь до файла в текущей рабочей директории или любой другой, когда путь до файла указан как относительный путь.
realpath
Первый вариант — использовать команду realpath:
Привет вывода абсолютного пути:
Эта программа является частью coreutils.
По умолчанию эта программа преобразует символические ссылки (опция -P) и показывает расположение файла даже если он не существует (опция -m) — то есть эти опции указывать необязательно.
Фактически, по умолчанию работа программы сводится к тому, что к указанному аргументу она добавляет текущую рабочую папку, то есть можно узнать абсолютный путь даже до файла, который не существует:
realpath not_exist /home/mial/bin/not_exist
Если вас это не устраивает, то используйте опцию -e — тогда если указанный файл не существует, то вместо вывода абсолютного пути будет показано сообщение об ошибке.
readlink
Аналогичную функцию выполняет и команда readlink.
Если вы хотите показать абсолютный путь только для существующих файлов, то используйте опцию -e:
readlink -e timeout /home/mial/bin/timeout
Если вас не волнует, существует ли файл, то используйте опцию -f (не требует существование последнего компонента) или опцию -m (не требует существование какого-либо компонента пути):
readlink -f not_exist /home/mial/bin/not_exist
realpath и readlink не найдены
UNIX системы — это не только многочисленные дистрибутивы Linux. В некоторых из них команды realpath и readlink могут отсутствовать. Если они отсутствуют и вы не хотите или не можете устанавливать дополнительные бинарные файлы, то выход всё равно есть.
Создайте файл, например, realpath.sh и скопируйте в него:
#! /bin/sh echo "$(cd "$(dirname "$1")"; pwd -P)/$(basename "$1")"
Этот же вариант в виде функции:
Вот эта же функция в продвинутом варианте — дополнительно обрабатывает ситуацию, когда директория не существует, а также если во вводе присутствуют ‘..’ или ‘.’
get_abs_filename() < # $1 : relative filename filename=$1 parentdir=$(dirname "$") if [ -d "$" ]; then echo "$(cd "$" && pwd)" elif [ -d "$" ]; then echo "$(cd "$" && pwd)/$(basename "$")" fi >
Ещё один вариант в виде функции оболочки, который:
- не требует утилит (только cd и pwd)
- работает для директорий и файлов
- обрабатывает .. и .
- обрабатывает пробелы в директориях и именах файлов
- требует, чтобы файл или директория существовали
- ничего не возвращает, если ничего не существует
- может принимать абсолютные пути в качестве ввода (хотя ничего с ними не делает)
function abspath() < # генерирует абсолютный путь из относительного # $1 : относительное имя файла # возвращает : абсолютный путь if [ -d "$1" ]; then # dir (cd "$1"; pwd) elif [ -f "$1" ]; then # file if [[ $1 = /* ]]; then echo "$1" elif [[ $1 == */* ]]; then echo "$(cd "$"; pwd)/$" else echo "$(pwd)/$1" fi fi >
И ещё одна функция, записанная в одну строку и работающая в bash и zsh (другие не проверялись):
Может работать с несуществующими файлами.
Связанные статьи:
Рекомендуемые статьи:
2 Комментарии
Зачем использовать какие-то скрипты с pwd, readlink или realpath для ТЕКУЩЕЙ директории, если можно просто использовать pwd. pwd /home/bestoloch Или просто прочитай глобальную переменную $PWD: echo $PWD /home/bestoloch Вдумайся, что такое ТЕКУЩАЯ директория! Это просто значение в переменной $PWD! «cd /home» и PWD=’/home’ это ОДНО И ТОЖЕ! Просто абстракция, благодаря которой ты думаешь, что «переходишь» из директории в директорию. А теперь включи мозг, и сообрази, как узнать путь к запускаемому скрипту, если запускаешь его не из ТЕКУЩЕЙ директории, а из, примеру, соседней?
Во-первых, вам надо что-то делать со своей манерой общения: даже если вы считаете себя самым умным и считаете что много знаете, разговаривать в таком тоне с вами никто не обязан. А вы далеко не самый умный — показанные способы подходят на все случаи жизни, в том числе, когда получаем путь для файла, который является ссылкой. С помощью pwd или переменной это не сработает. И самое главное, pwd не поможет, если нужно получить абсолютный путь не просто для файла в текущей папке, а для относительного пути (например, ../../bin/myfile.txt), а методы в статье предназначены именно для таких ситуаций, чтобы любые относительные пути преобразовывать в абсолютные. Следующее отличие — если мы просто будем добавлять к имени файла вывод команды pwd, то мы никогда не узнаем, существует ли этот файл на самом деле или нет. В статье рассмотрены оба варианта: когда в случае отсутствия файла будет или не будет возвращена ошибка. Ну и так далее. Ваш комментарий нелеп. Видимо, вы даже не понимаете, о чём говорится в статье.
Как узнать адрес файла на сервере
При работе с файлом сайта на сервере может возникнуть необходимость в определении его полного пути. Для выполнения этой задачи существует несколько способов, о них и пойдет речь далее.
Адреса файлов на серверах
Для начала предлагаю разобраться с тем, как вообще происходит получение адресов файлов. Самый распространенный способ – использование доступа к элементам при помощи протокола HTTP. В этом случае файлы выгружаются юзерами при помощи специального кодирования. В следующем отрывке кода вы наглядно видите, как происходит бинарный тип кодирования с использованием атрибута enctype:
Второй распространенный вариант – использование протокола FTP, который может работать в обоих направлениях – как для загрузки файлов, так и для их скачивания. На следующем скриншоте вы видите пример того, как отображается по FTP открытая для пользователей папка сайта с возможностью скачать любой файл.
Соответственно, на этой же странице можно с легкостью получить информацию о полном пути файла.
Определение адреса файла на сервере
Разберу основные методы получения адресов файлов, хранящихся на сервере.
Консольная утилита pwd (для Linux)
Пользователи выделенного сервера или VDS с Linux могут задействовать простую консольную утилиту pwd, которая предназначена для отображения пути текущего каталога, где сейчас и выполняются все действия. Эту утилиту можно использовать и для определения адреса файла на сервере. Вывод абсолютного пути осуществляется путем ввода простой команды:
Она поддерживает дополнительные опции, позволяющие немного модернизировать результат вывода:
-L — отменяет разыменовывание символических ссылок, их отображение осуществляется без конвертирования в исходный путь.
-p — конвертирует символические ссылки в их исходные имена с отображением указываемых директорий.
Если вы задаетесь вопросом, можно ли использовать pwd в своих скриптах, то ответ на него будет « Да » . В этом нет ничего сложного, а простое представление объявления утилиты выглядит как DIR=`pwd` или DIR=$(pwd).
Панели управления и FTP
При использовании услуг хостинга управление собственным веб-ресурсом происходит при помощи местной административной панели. Необходимо только знать ее устройство, чтобы быстро определить полный путь любого файла на сервере. Найдите домашнюю директорию в одном из разделов аккаунта. Путь к сайту может выглядеть примерно так: /var/www/user/data или /srv/www/hosts/mysite.com.
Конечно, есть и другие распространенные варианты представления данных путей, поэтому в случае надобности не стесняйтесь обращаться к технической поддержке хостинг-провайдера для получения соответствующей информации. Впрочем, далее остается только отыскать целевой файл в этой директории или ее подпапках, чтобы узнать путь, который и будет начинаться с адреса сайта.
Если вы арендуете виртуальный хостинг, то путь к файлу легко определить, если подключиться к серверу по FTP.
Откроем свойства файла любого файла в папке тестового сайта на WordPress и увидим его полный FTP-адрес.
Создание PHP-скрипта
Есть небольшой скрипт, который нужно сохранить в отдельном файле. Он позволяет получить абсолютный путь любого файла, а реализовывается это благодаря тому, что вся информация уже хранится под одной переменной $_SERVER . Создайте пустой файл и вставьте туда следующий код:
echo 'Document root: '.$_SERVER['DOCUMENT_ROOT'].'
'; echo 'Полный путь к скрипту и его имя: '.$_SERVER['SCRIPT_FILENAME'].'
'; echo 'Имя скрипта: '.$_SERVER['SCRIPT_NAME']; ?>
Отредактируйте его под себя, после чего сохраните с любым названием и задайте тип файла .php . Используйте FTP-клиент для загрузки этого файла в корневую папку целевого сайта.
Последний этап – запуск этого скрипта. В адресной строке браузера введите адрес вашего сайта и в конце добавьте /file.php , где file замените на название файла со скриптом. На новой странице в веб-обозревателе отобразятся примерно следующие сведения:
Document root: /home/XXXXX/YYYYY Полный путь к скрипту и его имя: /home/XXXX/YYYYY/url_path.php Имя скрипта: /url_path.php
Вы можете использовать один из этих методов, когда требуется определить абсолютный путь файла.