Відповіді:
Використовувати 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 repo в кінці 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повертає мене до батьківського dir, звідки породжується символічне посилання, але це ігнорує його.
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'
Результати цього можуть бути легко скопійовані в список пітонів або будь-яку подібну структуру даних.
Ви можете використовувати сценарій 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 на Mac OS X через Homebrew можна знайти в цьому аркуші StackExchange .
Примітка: Команди readlink -fта realpathкоманди повинні працювати з поля для користувачів, що не є Mac 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це зробимоЦе спрацювало досить добре для мене. Він не покладається на файлову систему (про / кон, залежно від потреби), тому він буде швидким; і, він повинен бути переносним для більшості будь-якого * 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. Потрібен дозвіл на компакт-диск у каталог файлу.
#!/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, якщо ви просто хочете отримати шлях до файлу у пошуку, натисніть на файл та прокрутіть униз до "Послуги" внизу. Ви отримуєте багато варіантів, включаючи "копіювати шлях" та "копіювати повний шлях". Клацання по одній із них ставить шлях до буфера обміну.
У 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