Відповіді:
Використовувати 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