Ответы:
Используйте readlink :
readlink -f file.txt
brew install coreutils
затемgreadlink -f file.txt
Я полагаю, вы используете Linux.
Я нашел утилиту под названием realpath
coreutils 8.15.
realpath file.txt
/data/ail_data/transformed_binaries/coreutils/test_folder_realpath/file.txt
Согласно комментариям @ styrofoam-fly и @ arch-standton, realpath
один не проверяет существование файла, для решения этой проблемы добавьте e
аргумент:realpath -e file
realpath
было совершено репо coreutils в конце 2011 года, выпуск 8.15 был сделан в январе 2012 года, я ответил на вопрос (с readlink
предложением) в марте 2011 года :)
realpath -e
печатает ошибку, если аргумент не существует.
Следующее обычно делает трюк:
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
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 / ..
Я знаю, что есть более простой способ, но, черт возьми, если я смогу это найти ...
jcomeau@intrepid:~$ python -c 'import os; print(os.path.abspath("cat.wav"))'
/home/jcomeau/cat.wav
jcomeau@intrepid:~$ ls $PWD/cat.wav
/home/jcomeau/cat.wav
find $PWD -type f | grep "filename"
или
find $PWD -type f -name "*filename*"
find `pwd` -type file -name \*.dmp
Shift
и щелкая правой кнопкой мыши файл в проводнике Windows, вы получаете опцию под названием Copy as Path
. Это скопирует полный путь к файлу в буфер обмена.realpath yourfile
чтобы получить полный путь к файлу, как предложено другими.Я знаю, что это старый вопрос сейчас, но просто добавить к информации здесь:
Команду Linux which
можно использовать для поиска пути к файлу команды, т.е.
$ which ls
/bin/ls
Есть несколько предостережений к этому; пожалуйста, смотрите https://www.cyberciti.biz/faq/how-do-i-find-the-path-to-a-command-file/ .
Работает на Mac, Linux, * nix:
Это даст вам CSV всех файлов в текущем каталоге:
ls | xargs -I {} echo "$(pwd -P)/{}" | xargs | sed 's/ /","/g'
Вывод этого может быть легко скопирован в список Python или любую аналогичную структуру данных.
Вы можете использовать скрипт fpn (полное имя пути) :
% pwd
/Users/adamatan/bins/scripts/fpn
% ls
LICENSE README.md fpn.py
% fpn *
/Users/adamatan/bins/scripts/fpn/LICENSE
/Users/adamatan/bins/scripts/fpn/README.md
/Users/adamatan/bins/scripts/fpn/fpn.py
fpn
это не стандартный пакет Linux, но это бесплатный и открытый проект github, и вы можете настроить его за минуту .
pwd
само по себе должно нормально работать в Linux и большинстве других Unix-подобных ОС.
Вы можете использовать эту функцию. Если имя файла задано без относительного пути, то предполагается, что оно присутствует в текущем рабочем каталоге:
abspath() { old=`pwd`;new=$(dirname "$1");if [ "$new" != "." ]; then cd $new; fi;file=`pwd`/$(basename "$1");cd $old;echo $file; }
Применение:
$ abspath file.txt
/I/am/in/present/dir/file.txt
Использование с относительным путем:
$ abspath ../../some/dir/some-file.txt
/I/am/in/some/dir/some-file.txt
С пробелами в имени файла:
$ abspath "../../some/dir/another file.txt"
/I/am/in/some/dir/another file.txt
В аналогичном сценарии я запускаю скрипт cshell из другого места. Для установки правильного абсолютного пути скрипта, чтобы он работал только в указанном каталоге, я использую следующий код:
set script_dir = `pwd`/`dirname $0`
$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
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
Это объяснение того , что происходит на @ ZeRemz в ответ :
"$1"
dirname "$1"
cd "$(dirname "$1")
в этот относительный реж&& pwd -P
и получить абсолютный путь для этого. -P
опция позволит избежать всех символических ссылок$(basename "$1")
echo
этоЭто хорошо сработало для меня. Он не зависит от файловой системы (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}
переменную в моих сценариях для прямой ссылки на другие сценарии.
Надеюсь это поможет,
Дейв
Вы можете сохранить это в своей shell.rc
или просто положить в консоль
function absolute_path { echo "$PWD/$1"; }
alias ap="absolute_path"
пример:
ap somefile.txt
будет выводить
/home/user/somefile.txt
ap ../foobar.txt
даст /home/user/../foobar.txt
, что не совсем то, что вы хотите.
ap /tmp/foobar.txt
даст /home/user//tmp/foobar.txt
, что не так.
find / -samefile file.txt -print
Найдет все ссылки на файл с тем же номером inode, что и file.txt
добавление -xdev
флага позволит избежать find
пересечения границ устройства («точки монтирования»). (Но это, вероятно, приведет к тому, что ничего не будет найдено, если find
он не запускается в каталоге на том же устройстве, что и file.txt
)
Обратите внимание, что find
может сообщать о нескольких путях для одного объекта файловой системы, потому что Inode может быть связан более чем одной записью каталога, возможно, даже используя разные имена. Например:
find /bin -samefile /bin/gunzip -ls
Будет выводить:
12845178 4 -rwxr-xr-x 2 root root 2251 feb 9 2012 /bin/uncompress
12845178 4 -rwxr-xr-x 2 root root 2251 feb 9 2012 /bin/gunzip
Это работает как с Linux, так и с Mac OSX.
echo $(pwd)$/$(ls file.txt)
В Mac OS, если вы просто хотите получить путь к файлу в поисковике, управляйте щелчком файла и прокрутите вниз до «Службы» внизу. Вы получаете множество вариантов, включая «копировать путь» и «копировать полный путь». Нажатие на один из них помещает путь в буфер обмена.
В Mac указанном ниже строке работает. Не нужно добавлять какие-либо необычные линии.
> pwd filename
print working directory
В Mac OSX выполните следующие действия:
cd
в каталог целевого файла.ls "`pwd`/file.txt"
echo $(pwd)/file.txt
file.txt
на ваше фактическое имя файла.Помимо "readlink -f", другая часто используемая команда:
$find /the/long/path/but/I/can/use/TAB/to/auto/it/to/ -name myfile /the/long/path/but/I/can/use/TAB/to/auto/it/to/myfile $
Это также дает полный путь и имя файла в консоли
Не по теме: этот метод просто дает относительные ссылки, а не абсолютные. Команда readlink -f
является правильной.
Создайте функцию, подобную приведенной ниже (выводит абсолютный путь к файлу с помощью pwd и добавляет файл в конец пути:
abspath() { echo $(pwd "$1")/"$1"; }
Теперь вы можете просто найти любой путь к файлу:
abspath myfile.ext