2012-06-28 6 views
25

Я хочу, чтобы преобразоватьКак преобразовать относительный путь к абсолютному пути в Unix

Относительный путь - /home/stevin/data/APP_SERVICE/../datafile.txt

к

Абсолютный путь - /home/stevin/data/datafile.txt

Есть встроенный инструмент в Unix, чтобы сделать это или какие-либо хорошие идеи относительно того, как я могу это реализовать.

-Стив

+0

Возможно, вы можете изменить ваш вопрос, чтобы указать, почему вы думаете, что вам нужно делать это. Это особенность! Удачи. – shellter

+0

Я печатаю Относительный путь в маленький файл и используя эту запись, чтобы позже скопировать файл в другое место. Тем не менее, папка APP_SERVICE иногда не существует и вызывает копирование с использованием этого относительного пути для отказа. – qwarentine

ответ

26

readlink -f /home/stevin/data/APP_SERVICE/../datafile.txt должны делать то, что вы ищете, предполагая, что ваш Unix/Linux имеет readlink.

+0

Извините, у меня нет readLink. Я нахожусь в Linux 2.6.18-194.el5 – qwarentine

+2

Какое распространение? 'readlink' обычно является частью пакета' coreutils', который обычно устанавливается по умолчанию. Заметьте, что это все строчные буквы, но не 'readLink', а' readlink' ... – twalberg

18

Что-то, как это может помочь в каталогах: (для файлов, добавлять с basename)

echo $(cd ../dir1/dir2/; pwd) 

Для файлов,

filepath=../dir1/dir2/file3 
echo $(cd $(dirname $filepath); pwd)/$(basename $filepath) 
+0

+1 Фактически 'echo '$ (cd $ (dirname $ thingie); pwd)/$ (basename $ thingie)" 'делает трюк для обоих файлов каталогов _and_, так как 'dirname' и' basename' просто обрабатывают строки и не заботятся о том, является ли строка, над которой они работают, фактическим объектом FS –

+0

@TobiasKienzler Ohh, да, это была опечатка, до сих пор, чтобы иметь как '../ dir1/dir2/file3', так и' $ t' одновременно. Я это исправлю. :) – SuperSaiyan

+0

Поскольку OP упоминает, что у него даже нет 'readlink', [здесь] (http://stackoverflow.com/a/20198034/321973), это решение даже не требует' dirname' и 'basename' ... –

0

на основе Thrustmaster's answer но с чистым Баш:

THING="/home/stevin/data/APP_SERVICE/../datafile.txt" 
echo "$(cd ${THING%/*}; pwd)/${THING##*/}" 

Конечно, для cd требуется путь к ctually существуют, что может не всегда иметь место - в этом случае у вас, вероятно, будет более простая жизнь, написав небольшой скрипт Python вместо этого ...

11

Я удивлен, что никто не упоминает realpath. Передайте свои пути к realpath, и он будет канонизировать их.

$ ls 
Changes 
dist.ini 

$ ls | xargs realpath 
/home/steven/repos/perl-Alt-Module-Path-SHARYANTO/Changes 
/home/steven/repos/perl-Alt-Module-Path-SHARYANTO/dist.ini 
+0

Установлен ли 'realpath' по умолчанию в вашей системе? –

+0

Непонятно, что означает «встроенный инструмент в Unix» (OP может означать внутреннюю команду оболочки). Даже «установленный по умолчанию» является неопределенным, поскольку установщики ОС обычно позволяют пользователю выбирать, какие компоненты устанавливать. Что касается 'realpath', то он поставляется с Debian/Ubuntu и является просто apt-get/aptitude. Но в любом случае, OP также спрашивает о «любых хороших идеях». –

+0

В моей системе мне нужно добавить опцию '-f'. –

Смежные вопросы