Как получить полный путь к файлу в 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
Команда realpath — это самый простой и надежный способ получить абсолютный путь к файлу в системах Linux и Unix. Она специально разработана для этой цели и доступна в большинстве современных дистрибутивов Linux как часть пакета GNU coreutils.
Базовый синтаксис
realpath имя_файла
Для вашего конкретного примера:
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: Подавляет сообщения об ошибках
Пример с опциями:
realpath -e file.txt # Убеждается, что все компоненты пути существуют
realpath -m non_existent.txt # Работает даже если файл не существует
Согласно странице руководства Linux, realpath “выводит разрешенное абсолютное имя файла; все компоненты, кроме последнего, должны существовать” и является “лучшим ответом” для получения абсолютных путей в shell-скриптах.
Альтернативные методы
Хотя realpath является наиболее удобным методом, существует несколько альтернативных подходов, которые можно использовать в зависимости от ваших конкретных потребностей и конфигурации системы.
Использование команды readlink
Команда readlink также может разрешать абсолютные пути, хотя она обычно используется для символических ссылок:
readlink -f file.txt
Как объясняется на nixCraft, эта команда “находит абсолютное имя пути для заданной команды или файла” и во многих случаях работает аналогично realpath.
Комбинация pwd и basename
Для более ручного подхода можно объединить команду pwd с basename:
pwd/$(basename file.txt)
Или более надежная версия, упомянутая на Stack Overflow:
cd "$(dirname "$1")" && pwd -P && basename "$1"
Использование команды find
Когда вам нужно найти файлы в нескольких каталогах и получить их абсолютные пути:
find $(pwd) -name "file.txt"
Или для получения абсолютных путей непосредственно из результатов find:
find ./path -name "file.txt" -exec readlink -f {} \;
Как упоминается в обсуждении на Ask Ubuntu, можно использовать расширение тильды в bash для гарантии вывода абсолютных путей find.
Практические примеры и варианты использования
Рассмотрим несколько практических сценариев, где эти команды полезны.
Базовое разрешение пути к файлу
# В каталоге /home/user/documents
$ ls
file.txt
$ realpath file.txt
/home/user/documents/file.txt
Работа с символическими ссылками
# Создаем символическую ссылку
$ 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 особенно полезен:
#!/bin/bash
# Получаем абсолютный путь текущего скрипта
SCRIPT_PATH=$(realpath "$0")
echo "Этот скрипт расположен по адресу: $SCRIPT_PATH"
# Получаем абсолютный путь к файлу параметра
if [ $# -gt 0 ]; then
FILE_PATH=$(realpath "$1")
echo "Файл '$1' находится по адресу: $FILE_PATH"
fi
Пакетная обработка нескольких файлов
# Получаем абсолютные пути ко всем файлам .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-скриптах и операциях командной строки учитывайте эти лучшие практики:
Всегда используйте абсолютные пути, когда это возможно
Абсолютные пути предоставляют однозначные ссылки на файлы и каталоги, делая ваши скрипты более надежными:
# Хорошо - абсолютный путь
realpath config.conf
# Избегайте - относительный путь, который может измениться
./config.conf
Правильно обрабатывайте символические ссылки
Определите, нужно ли вам следовать по символическим ссылкам или сохранять их в зависимости от вашего случая использования:
# Следовать по символическим ссылкам (поведение по умолчанию)
realpath file.txt
# Не следовать по символическим ссылкам
realpath -s file.txt
Проверяйте существование файла при необходимости
Используйте соответствующие флаги realpath для проверки существования файла:
# Проверить, существует ли файл, и получить путь
if [ -f "$(realpath -e file.txt)" ]; then
echo "Файл существует по адресу: $(realpath file.txt)"
fi
Используйте обработку ошибок
Всегда учитывайте, что происходит, когда файлы не существуют или пути недействительны:
FILE_PATH=$(realpath -m "file.txt" 2>/dev/null)
if [ $? -eq 0 ]; then
echo "Путь к файлу: $FILE_PATH"
else
echo "Ошибка: Не удалось разрешить путь к файлу"
fi
Учитывайте переносимость
Для максимальной совместимости между различными дистрибутивами Linux и системами Unix:
# Проверить, доступен ли 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.
Источники
- How to get full path of a file? - Stack Overflow
- Getting the Absolute Directory of a File in Linux | Baeldung on Linux
- How to Find Full Path of a File in Linux - Linux Handbook
- How to obtain the absolute path of a file via Shell (BASH/ZSH/SH)? - Stack Overflow
- Get absolute path of files using ‘find’ command - Ask Ubuntu
- realpath(1) - Linux manual page
- Linux realpath: Find Absolute Pathname For Given Command or File - nixCraft
- How to Get the Full Path of a File in Linux - GeeksforGeeks
- A beginner’s guide to navigating the Linux filesystem - Red Hat
- Resolve to an absolute path with the Linux realpath command - Dustin John Pfister