Другое

Как получить полный путь к файлу в Linux

Узнайте, как получить полный путь к любому файлу в Linux с помощью realpath, readlink и других команд. Изучите лучшие методы получения абсолютных путей в shell-скриптах и операциях управления файлами.

Как получить полный путь к файлу?

Есть ли простой способ вывести полный путь к файлу с именем file.txt? Например, если файл находится по адресу /nfs/an/disks/jj/home/dir/file.txt, какую команду нужно выполнить в директории, содержащей этот файл, чтобы отобразить его абсолютный путь?

Команда должна вывести:

/nfs/an/disks/jj/home/dir/file.txt

Чтобы получить полный путь к файлу с именем file.txt, можно использовать команду realpath. Просто выполните realpath file.txt в каталоге, содержащем файл, и она выведет абсолютный путь /nfs/an/disks/jj/home/dir/file.txt. Эта команда разрешает символические ссылки и предоставляет канонизированный абсолютный путь к файлу, делая ее наиболее надежным методом для получения полных путей к файлам в системах Linux и Unix.


Содержание


Использование команды realpath

Команда realpath — это самый простой и надежный способ получить абсолютный путь к файлу в системах Linux и Unix. Она специально разработана для этой цели и доступна в большинстве современных дистрибутивов Linux как часть пакета GNU coreutils.

Базовый синтаксис

bash
realpath имя_файла

Для вашего конкретного примера:

bash
realpath file.txt

Это выведет:

/nfs/an/disks/jj/home/dir/file.txt

Ключевые особенности realpath

  • Разрешает символические ссылки: Если file.txt является символической ссылкой, realpath перейдет по ней к фактическому файлу
  • Нормализует пути: Удаляет избыточные компоненты . и .., лишние слэши и разрешает ссылки на /./, /../
  • Работает с несуществующими файлами: В отличие от некоторых альтернатив, realpath может работать даже если файл не существует (с соответствующими флагами)

Распространенные опции

  • -e, --canonicalize-existing: Все компоненты пути должны существовать
  • -m, --canonicalize-missing: Ни один компонент пути не обязан существовать
  • -s, --strip: Удаляет каталоги . и .., но не символические ссылки
  • -q, --quiet: Подавляет сообщения об ошибках

Пример с опциями:

bash
realpath -e file.txt  # Убеждается, что все компоненты пути существуют
realpath -m non_existent.txt  # Работает даже если файл не существует

Согласно странице руководства Linux, realpath “выводит разрешенное абсолютное имя файла; все компоненты, кроме последнего, должны существовать” и является “лучшим ответом” для получения абсолютных путей в shell-скриптах.


Альтернативные методы

Хотя realpath является наиболее удобным методом, существует несколько альтернативных подходов, которые можно использовать в зависимости от ваших конкретных потребностей и конфигурации системы.

Использование команды readlink

Команда readlink также может разрешать абсолютные пути, хотя она обычно используется для символических ссылок:

bash
readlink -f file.txt

Как объясняется на nixCraft, эта команда “находит абсолютное имя пути для заданной команды или файла” и во многих случаях работает аналогично realpath.

Комбинация pwd и basename

Для более ручного подхода можно объединить команду pwd с basename:

bash
pwd/$(basename file.txt)

Или более надежная версия, упомянутая на Stack Overflow:

bash
cd "$(dirname "$1")" && pwd -P && basename "$1"

Использование команды find

Когда вам нужно найти файлы в нескольких каталогах и получить их абсолютные пути:

bash
find $(pwd) -name "file.txt"

Или для получения абсолютных путей непосредственно из результатов find:

bash
find ./path -name "file.txt" -exec readlink -f {} \;

Как упоминается в обсуждении на Ask Ubuntu, можно использовать расширение тильды в bash для гарантии вывода абсолютных путей find.


Практические примеры и варианты использования

Рассмотрим несколько практических сценариев, где эти команды полезны.

Базовое разрешение пути к файлу

bash
# В каталоге /home/user/documents
$ ls
file.txt

$ realpath file.txt
/home/user/documents/file.txt

Работа с символическими ссылками

bash
# Создаем символическую ссылку
$ ln -s /home/user/documents/file.txt shortcut

# realpath разрешает ссылку
$ realpath shortcut
/home/user/documents/file.txt

# Без разрешения ссылки
$ readlink shortcut
/home/user/documents/file.txt

Использование в скриптах

В shell-скриптах realpath особенно полезен:

bash
#!/bin/bash

# Получаем абсолютный путь текущего скрипта
SCRIPT_PATH=$(realpath "$0")
echo "Этот скрипт расположен по адресу: $SCRIPT_PATH"

# Получаем абсолютный путь к файлу параметра
if [ $# -gt 0 ]; then
    FILE_PATH=$(realpath "$1")
    echo "Файл '$1' находится по адресу: $FILE_PATH"
fi

Пакетная обработка нескольких файлов

bash
# Получаем абсолютные пути ко всем файлам .txt в текущем каталоге
for file in *.txt; do
    echo "$(realpath "$file")"
done

Как демонстрирует Dustin John Pfister, realpath “очень прост и интуитивен” и “достаточно удобен при использовании в скриптах”.


Сравнение различных подходов

Вот сравнение различных методов получения абсолютных путей к файлам:

Метод Плюсы Минусы Лучше всего подходит для
realpath file.txt Просто, разрешает символические ссылки, стандартный Недоступен на очень старых системах Общего назначения, современные системы
readlink -f file.txt Похож на realpath, широко доступен Немного более сложный синтаксис Системы без realpath
pwd/$(basename file.txt) Нет внешних зависимостей Не разрешает символические ссылки, менее надежный Простых случаев, когда вы знаете, что файл существует
find $(pwd) -name "file.txt" Работает с несколькими файлами, гибкий Более сложный для одного файла Поиска файлов в разных каталогах
cd "$(dirname "$1")" && pwd -P Полное разрешение пути Условный, более сложный Сложных сценариев, требующих полного разрешения пути

Согласно GeeksforGeeks, “Readlink и realpath очень просты и интуитивны; их комбинация с basename и dirname делает их достаточно удобными при использовании в скриптах. Команда find хороша для поиска файлов в разных каталогах.”


Лучшие практики для работы с путями к файлам

При работе с путями к файлам в shell-скриптах и операциях командной строки учитывайте эти лучшие практики:

Всегда используйте абсолютные пути, когда это возможно

Абсолютные пути предоставляют однозначные ссылки на файлы и каталоги, делая ваши скрипты более надежными:

bash
# Хорошо - абсолютный путь
realpath config.conf

# Избегайте - относительный путь, который может измениться
./config.conf

Правильно обрабатывайте символические ссылки

Определите, нужно ли вам следовать по символическим ссылкам или сохранять их в зависимости от вашего случая использования:

bash
# Следовать по символическим ссылкам (поведение по умолчанию)
realpath file.txt

# Не следовать по символическим ссылкам
realpath -s file.txt

Проверяйте существование файла при необходимости

Используйте соответствующие флаги realpath для проверки существования файла:

bash
# Проверить, существует ли файл, и получить путь
if [ -f "$(realpath -e file.txt)" ]; then
    echo "Файл существует по адресу: $(realpath file.txt)"
fi

Используйте обработку ошибок

Всегда учитывайте, что происходит, когда файлы не существуют или пути недействительны:

bash
FILE_PATH=$(realpath -m "file.txt" 2>/dev/null)
if [ $? -eq 0 ]; then
    echo "Путь к файлу: $FILE_PATH"
else
    echo "Ошибка: Не удалось разрешить путь к файлу"
fi

Учитывайте переносимость

Для максимальной совместимости между различными дистрибутивами Linux и системами Unix:

bash
# Проверить, доступен ли realpath
if command -v realpath >/dev/null 2>&1; then
    PATH=$(realpath file.txt)
else
    # Альтернатива для систем без realpath
    PATH=$(cd "$(dirname "$1")" && pwd -P)/"$(basename "$1")"
fi

Заключение

Получение полного пути к файлу в системах Linux и Unix является простой задачей с помощью команды realpath, которая предоставляет наиболее надежный и удобный метод для получения абсолютных путей к файлам. Для вашего конкретного примера получения пути к file.txt просто выполнение realpath file.txt выведет полный абсолютный путь /nfs/an/disks/jj/home/dir/file.txt.

Ключевые выводы

  • Используйте realpath file.txt для самого простого и надежного метода получения абсолютных путей к файлам
  • Альтернативные методы, такие как readlink -f, pwd/basename и find, предлагают различные подходы для конкретных случаев использования
  • Разрешение символических ссылок автоматически обрабатывается realpath, делая ее идеальной для сложных файловых систем
  • Совместимость со скриптами отличная с realpath, хотя существуют методы отката для старых систем
  • Обработка ошибок должна учитываться при работе с потенциально несуществующими файлами

Для большинства повседневных случаев использования и shell-скриптинга realpath должна быть вашей основной командой для получения абсолютных путей к файлам в средах Linux и Unix.


Источники

  1. How to get full path of a file? - Stack Overflow
  2. Getting the Absolute Directory of a File in Linux | Baeldung on Linux
  3. How to Find Full Path of a File in Linux - Linux Handbook
  4. How to obtain the absolute path of a file via Shell (BASH/ZSH/SH)? - Stack Overflow
  5. Get absolute path of files using ‘find’ command - Ask Ubuntu
  6. realpath(1) - Linux manual page
  7. Linux realpath: Find Absolute Pathname For Given Command or File - nixCraft
  8. How to Get the Full Path of a File in Linux - GeeksforGeeks
  9. A beginner’s guide to navigating the Linux filesystem - Red Hat
  10. Resolve to an absolute path with the Linux realpath command - Dustin John Pfister
Авторы
Проверено модерацией
Модерация