Только что протестировал на 10.9.2, отлично работает. который читает ссылку / usr / local / opt / coreutils / libexec / gnubin / readlink readlink
версия
10
@ J0hnG4lt: это потому, что вы установили coreutils с помощью homebrew и изменили путь PATH, чтобы он указывал на нефиксированные двоичные файлы. Установка coreutils, оставление PATH в покое и использование «greadlink» также будет работать.
Тим Смит
35
на MAC: установить доморощенного затем brew install coreutilsзатемgreadlink -f file.txt
к Кра
217
Я полагаю, вы используете Linux.
Я нашел утилиту под названием realpathcoreutils 8.15.
Согласно комментариям @ styrofoam-fly и @ arch-standton, realpathодин не проверяет существование файла, для решения этой проблемы добавьте eаргумент:realpath -e file
realpathбыло совершено репо coreutils в конце 2011 года, выпуск 8.15 был сделан в январе 2012 года, я ответил на вопрос (с readlinkпредложением) в марте 2011 года :)
filmor
2
realpath не проверяет существование файла, он просто разрешает пути. Запрос полного пути к несуществующему файлу должен привести к ошибке.
пенополистирол, перелет
4
@styrofoamfly realpath -eпечатает ошибку, если аргумент не существует.
Привет. Я нашел этот ответ лучше всего на мое требование. Можете ли вы объяснить, как я могу использовать локальную переменную вместо параметра командной строки (то есть $ 1)
@SopalajodeArrierez Поскольку readlinkне работает, если файл является символической ссылкой, он покажет вам цель символической ссылки вместо самой символической ссылки.
qwertzguy
1
Мне это нравится, потому что readlinkвозвращает меня к родительскому каталогу, из которого генерируется символическая ссылка, но это игнорирует его.
Сухи
set .. && echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1") ### Вывод: / home / ravi / ..
Том Хейл
35
Я знаю, что есть более простой способ, но, черт возьми, если я смогу это найти ...
Удерживая Shiftи щелкая правой кнопкой мыши файл в проводнике Windows, вы получаете опцию под названием Copy as Path. Это скопирует полный путь к файлу в буфер обмена.
В Linux:
Вы можете использовать команду, realpath yourfileчтобы получить полный путь к файлу, как предложено другими.
В аналогичном сценарии я запускаю скрипт cshell из другого места. Для установки правильного абсолютного пути скрипта, чтобы он работал только в указанном каталоге, я использую следующий код:
set script_dir = `pwd`/`dirname $0`
$0 хранит точную строку, как скрипт был выполнен.
Для , например , если сценарий был запущен как это: $> ../../test/test.csh,
$script_dirбудет содержать/home/abc/sandbox/v1/../../test
за это проголосовали, так как это самый простой и актуальный вариант. Однако, если вы напечатаете, у ./test.cshвас будет путь, заканчивающийся на/test/.
vinyll
2
Для Mac OS X я заменил утилиты, поставляемые с операционной системой, и заменил их более новой версией coreutils. Это позволяет вам получать доступ к таким инструментам, как readlink -f(для абсолютного пути к файлам) и realpath(абсолютному пути к каталогам) на вашем Mac.
Версия Homebrew добавляет «G» (для инструментов GNU) перед именем команды - так что эквиваленты становятся greadlink -f FILEи grealpath DIRECTORY.
Инструкции по установке coreutils / GNU Tools на Mac OS X через Homebrew можно найти в этой статье StackExchange .
NB: readlink -fи realpathкоманды должны работать из коробки для пользователей , не Mac Unix.
Это хорошо сработало для меня. Он не зависит от файловой системы (pro / con в зависимости от необходимости), поэтому он будет быстрым; и он должен быть переносимым для большинства * NIX. Предполагается, что переданная строка действительно относится к PWD, а не к какому-либо другому каталогу.
function abspath () {
echo $1 | awk '\
# Root parent directory refs to the PWD for replacement below
/^\.\.\// { sub("^", "./") } \
# Replace the symbolic PWD refs with the absolute PWD \
/^\.\// { sub("^\.", ENVIRON["PWD"])} \
# Print absolute paths \
/^\// {print} \'
}
Это наивно, но я должен был сделать это, чтобы быть POSIX-совместимым. Требуется разрешение для CD в каталог файла.
#!/bin/sh
if [ ${#} = 0 ]; then
echo "Error: 0 args. need 1" >&2
exit 1
fi
if [ -d ${1} ]; then
# Directory
base=$( cd ${1}; echo ${PWD##*/} )
dir=$( cd ${1}; echo ${PWD%${base}} )
if [ ${dir} = / ]; then
parentPath=${dir}
else
parentPath=${dir%/}
fi
if [ -z ${base} ] || [ -z ${parentPath} ]; then
if [ -n ${1} ]; then
fullPath=$( cd ${1}; echo ${PWD} )
else
echo "Error: unsupported scenario 1" >&2
exit 1
fi
fi
elif [ ${1%/*} = ${1} ]; then
if [ -f ./${1} ]; then
# File in current directory
base=$( echo ${1##*/} )
parentPath=$( echo ${PWD} )
else
echo "Error: unsupported scenario 2" >&2
exit 1
fi
elif [ -f ${1} ] && [ -d ${1%/*} ]; then
# File in directory
base=$( echo ${1##*/} )
parentPath=$( cd ${1%/*}; echo ${PWD} )
else
echo "Error: not file or directory" >&2
exit 1
fi
if [ ${parentPath} = / ]; then
fullPath=${fullPath:-${parentPath}${base}}
fi
fullPath=${fullPath:-${parentPath}/${base}}
if [ ! -e ${fullPath} ]; then
echo "Error: does not exist" >&2
exit 1
fi
echo ${fullPath}
Мне нравятся многие ответы, которые уже даны, но я нашел это действительно полезным, особенно в скрипте, чтобы получить полный путь к файлу, включая следующие символические ссылки и относительные ссылки, такие как .и..
dirname `readlink -e relative/path/to/file`
Который будет возвращать полный путь fileот корневого пути и далее. Это можно использовать в скрипте, чтобы скрипт знал, по какому пути он работает, что полезно в клоне репозитория, который может находиться в любом месте на машине.
basePath=`dirname \`readlink -e $0\``
Затем я могу использовать ${basePath}переменную в моих сценариях для прямой ссылки на другие сценарии.
Но потом ap ../foobar.txtдаст /home/user/../foobar.txt, что не совсем то, что вы хотите.
Bdesham
2
И ap /tmp/foobar.txtдаст /home/user//tmp/foobar.txt, что не так.
Дэвид Дан
-1
find / -samefile file.txt -print
Найдет все ссылки на файл с тем же номером inode, что и file.txt
добавление -xdevфлага позволит избежать findпересечения границ устройства («точки монтирования»). (Но это, вероятно, приведет к тому, что ничего не будет найдено, если findон не запускается в каталоге на том же устройстве, что и file.txt)
Обратите внимание, что findможет сообщать о нескольких путях для одного объекта файловой системы, потому что Inode может быть связан более чем одной записью каталога, возможно, даже используя разные имена. Например:
В Mac OS, если вы просто хотите получить путь к файлу в поисковике, управляйте щелчком файла и прокрутите вниз до «Службы» внизу. Вы получаете множество вариантов, включая «копировать путь» и «копировать полный путь». Нажатие на один из них помещает путь в буфер обмена.
brew install coreutils
затемgreadlink -f file.txt
Я полагаю, вы используете Linux.
Я нашел утилиту под названием
realpath
coreutils 8.15.Согласно комментариям @ styrofoam-fly и @ arch-standton,
realpath
один не проверяет существование файла, для решения этой проблемы добавьтеe
аргумент:realpath -e file
источник
realpath
было совершено репо coreutils в конце 2011 года, выпуск 8.15 был сделан в январе 2012 года, я ответил на вопрос (сreadlink
предложением) в марте 2011 года :)realpath -e
печатает ошибку, если аргумент не существует.Следующее обычно делает трюк:
источник
LOCAL_VARIABLE="filename.txt" && echo $(cd $(dirname "$LOCAL_VARIABLE") && pwd -P)/$(basename "$LOCAL_VARIABLE")
readlink
не работает, если файл является символической ссылкой, он покажет вам цель символической ссылки вместо самой символической ссылки.readlink
возвращает меня к родительскому каталогу, из которого генерируется символическая ссылка, но это игнорирует его.set .. && echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
### Вывод: / home / ravi / ..Я знаю, что есть более простой способ, но, черт возьми, если я смогу это найти ...
источник
или
источник
find `pwd` -type file -name \*.dmp
Если вы находитесь в том же каталоге, что и файл:
Замените
file.txt
на целевое имя файла.источник
echo $(pwd)/file.txt
В Windows:
Shift
и щелкая правой кнопкой мыши файл в проводнике Windows, вы получаете опцию под названиемCopy as Path
. Это скопирует полный путь к файлу в буфер обмена.В Linux:
realpath yourfile
чтобы получить полный путь к файлу, как предложено другими.источник
Я знаю, что это старый вопрос сейчас, но просто добавить к информации здесь:
Команду Linux
which
можно использовать для поиска пути к файлу команды, т.е.Есть несколько предостережений к этому; пожалуйста, смотрите https://www.cyberciti.biz/faq/how-do-i-find-the-path-to-a-command-file/ .
источник
Работает на Mac, Linux, * nix:
Это даст вам CSV всех файлов в текущем каталоге:
Вывод этого может быть легко скопирован в список Python или любую аналогичную структуру данных.
источник
Вы можете использовать скрипт fpn (полное имя пути) :
fpn
это не стандартный пакет Linux, но это бесплатный и открытый проект github, и вы можете настроить его за минуту .источник
pwd
само по себе должно нормально работать в Linux и большинстве других Unix-подобных ОС.Вы можете использовать эту функцию. Если имя файла задано без относительного пути, то предполагается, что оно присутствует в текущем рабочем каталоге:
Применение:
Использование с относительным путем:
С пробелами в имени файла:
источник
В аналогичном сценарии я запускаю скрипт cshell из другого места. Для установки правильного абсолютного пути скрипта, чтобы он работал только в указанном каталоге, я использую следующий код:
$0
хранит точную строку, как скрипт был выполнен.Для , например , если сценарий был запущен как это:
$> ../../test/test.csh
,$script_dir
будет содержать/home/abc/sandbox/v1/../../test
источник
./test.csh
вас будет путь, заканчивающийся на/test/.
Для Mac OS X я заменил утилиты, поставляемые с операционной системой, и заменил их более новой версией coreutils. Это позволяет вам получать доступ к таким инструментам, как
readlink -f
(для абсолютного пути к файлам) иrealpath
(абсолютному пути к каталогам) на вашем Mac.Версия Homebrew добавляет «G» (для инструментов GNU) перед именем команды - так что эквиваленты становятся
greadlink -f FILE
иgrealpath DIRECTORY
.Инструкции по установке coreutils / GNU Tools на Mac OS X через Homebrew можно найти в этой статье StackExchange .
NB:
readlink -f
иrealpath
команды должны работать из коробки для пользователей , не Mac Unix.источник
brew install coreutils
Это объяснение того , что происходит на @ ZeRemz в ответ :
"$1"
dirname "$1"
cd "$(dirname "$1")
в этот относительный реж&& pwd -P
и получить абсолютный путь для этого.-P
опция позволит избежать всех символических ссылок$(basename "$1")
echo
этоисточник
Это хорошо сработало для меня. Он не зависит от файловой системы (pro / con в зависимости от необходимости), поэтому он будет быстрым; и он должен быть переносимым для большинства * NIX. Предполагается, что переданная строка действительно относится к PWD, а не к какому-либо другому каталогу.
источник
Это наивно, но я должен был сделать это, чтобы быть POSIX-совместимым. Требуется разрешение для CD в каталог файла.
источник
Как правило:
В качестве альтернативы, только для текущей папки:
источник
Мне нравятся многие ответы, которые уже даны, но я нашел это действительно полезным, особенно в скрипте, чтобы получить полный путь к файлу, включая следующие символические ссылки и относительные ссылки, такие как
.
и..
Который будет возвращать полный путь
file
от корневого пути и далее. Это можно использовать в скрипте, чтобы скрипт знал, по какому пути он работает, что полезно в клоне репозитория, который может находиться в любом месте на машине.Затем я могу использовать
${basePath}
переменную в моих сценариях для прямой ссылки на другие сценарии.Надеюсь это поможет,
Дейв
источник
Вы можете сохранить это в своей
shell.rc
или просто положить в консольпример:
будет выводить
источник
ap ../foobar.txt
даст/home/user/../foobar.txt
, что не совсем то, что вы хотите.ap /tmp/foobar.txt
даст/home/user//tmp/foobar.txt
, что не так.Найдет все ссылки на файл с тем же номером inode, что и file.txt
добавление
-xdev
флага позволит избежатьfind
пересечения границ устройства («точки монтирования»). (Но это, вероятно, приведет к тому, что ничего не будет найдено, еслиfind
он не запускается в каталоге на том же устройстве, что иfile.txt
)Обратите внимание, что
find
может сообщать о нескольких путях для одного объекта файловой системы, потому что Inode может быть связан более чем одной записью каталога, возможно, даже используя разные имена. Например:Будет выводить:
источник
Это будет работать как для файла, так и для папки:
источник
Это работает как с Linux, так и с Mac OSX.
источник
Другая утилита Linux, которая делает эту работу:
источник
В Mac OS, если вы просто хотите получить путь к файлу в поисковике, управляйте щелчком файла и прокрутите вниз до «Службы» внизу. Вы получаете множество вариантов, включая «копировать путь» и «копировать полный путь». Нажатие на один из них помещает путь в буфер обмена.
источник
В Mac указанном ниже строке работает. Не нужно добавлять какие-либо необычные линии.
источник
print working directory
Копирует текст в буфер обмена и отображает текст в окне терминала.
:)
(Я скопировал часть кода из другого ответа переполнения стека, но больше не могу найти этот ответ)
источник
самый простой способ, который я нашел, это
это хорошо работает для меня
источник
В Mac OSX выполните следующие действия:
cd
в каталог целевого файла.file.txt
на ваше фактическое имя файла.источник
Помимо "readlink -f", другая часто используемая команда:
Это также дает полный путь и имя файла в консоли
Не по теме: этот метод просто дает относительные ссылки, а не абсолютные. Команда
readlink -f
является правильной.источник
Создайте функцию, подобную приведенной ниже (выводит абсолютный путь к файлу с помощью pwd и добавляет файл в конец пути:
Теперь вы можете просто найти любой путь к файлу:
источник