Właśnie przetestowany na 10.9.2, działa dobrze. które readlink / usr / local / opt / coreutils / libexec / gnubin / readlink readlink - readlink readversion (GNU coreutils) 8.22
J0hnG4lt
10
@ J0hnG4lt: to dlatego, że zainstalowałeś coreutils z homebrew i zmieniłeś swoją ŚCIEŻKĘ, aby wskazywała na nieprefiksowane pliki binarne. Zainstalowanie coreutils, pozostawienie PATH w spokoju i użycie „greadlink” również by działało.
Tim Smith
35
na MAC: zainstaluj homebrew, a brew install coreutilsnastępniegreadlink -f file.txt
Do Kra
217
Podejrzewam, że używasz Linuksa.
Znalazłem narzędzie o nazwie realpathcoreutils 8.15.
Zgodnie z komentarzami @ styrofoam-fly i @ arch-standton, realpathsamo nie sprawdza istnienia pliku, aby rozwiązać ten problem, dodaj eargument:realpath -e file
realpathbył zaangażowany w repozytorium coreutils pod koniec 2011 roku, wydanie 8.15 zostało zrobione w styczniu 2012 roku, odpowiedziałem na to pytanie (z readlinksugestią) w marcu 2011 roku :)
filmowiec
2
realpath nie sprawdza istnienia pliku, po prostu rozwiązuje ścieżki. Pytanie o pełną ścieżkę nieistniejącego pliku powinno spowodować błąd.
mucha styropianowa
4
@styrofoamfly realpath -ewyświetla błąd, jeśli argument nie istnieje.
Witaj. Uznałem tę odpowiedź za najlepiej spełniającą moje wymagania. Czy możesz wyjaśnić, w jaki sposób mogę użyć zmiennej lokalnej zamiast parametru wiersza poleceń (tj. 1 $)
@SopalajodeArrierez Ponieważ readlinknie działa, jeśli plik jest dowiązaniem symbolicznym, pokaże cel dowiązania symbolicznego zamiast samego dowiązania symbolicznego.
qwertzguy
1
Podoba mi się to, ponieważ readlinkzabiera mnie z powrotem do katalogu nadrzędnego, z którego generowane jest dowiązanie symboliczne, ale to go ignoruje.
Sukhi
set .. && echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1") ### Wyjście: / home / ravi / ..
Tom Hale
35
Ja wiem, istnieje prostszy sposób, że to, ale cholernie czy mogę go znaleźć ...
Przytrzymanie Shifti kliknięcie pliku prawym przyciskiem myszy w Eksploratorze Windows daje opcję o nazwie Copy as Path. Spowoduje to skopiowanie pełnej ścieżki pliku do schowka.
W systemie Linux:
Możesz użyć tego polecenia, realpath yourfileaby uzyskać pełną ścieżkę do pliku, jak sugerują inni.
W podobnym scenariuszu uruchamiam skrypt cshell z innej lokalizacji. Aby ustawić poprawną bezwzględną ścieżkę skryptu, tak aby działał on tylko w wyznaczonym katalogu, używam następującego kodu:
set script_dir = `pwd`/`dirname $0`
$0 przechowuje dokładny ciąg wykonania skryptu.
Na przykład, jeśli skrypt został uruchomiony tak: $> ../../test/test.csh,
$script_dirbędzie zawierał/home/abc/sandbox/v1/../../test
głosował za tym, ponieważ jest to najłatwiejszy i najbardziej odpowiedni. Jeśli jednak wpiszesz ./test.csh, będziesz mieć ścieżkę kończącą się na/test/.
winyl
2
W systemie Mac OS X zastąpiłem narzędzia dostarczane z systemem operacyjnym i zastąpiłem je nowszą wersją coreutils. Umożliwia to dostęp do narzędzi takich jak readlink -f(bezwzględna ścieżka do plików) i realpath(bezwzględna ścieżka do katalogów) na komputerze Mac.
Wersja Homebrew dołącza „G” (dla GNU Tools) przed nazwą polecenia - więc odpowiedniki stają się greadlink -f FILEi grealpath DIRECTORY.
Instrukcje dotyczące instalacji narzędzi coreutils / GNU w systemie Mac OS X za pośrednictwem Homebrew można znaleźć w tym artykule StackExchange .
Uwaga: Polecenia readlink -fi realpathpowinny działać od razu po wyjęciu z pudełka dla użytkowników systemów operacyjnych innych niż Mac.
To działało całkiem dobrze dla mnie. Nie opiera się na systemie plików (za / przeciw w zależności od potrzeb), więc będzie szybki; i powinien być przenośny dla większości * NIX. Zakłada, że przekazany ciąg jest rzeczywiście względny do PWD, a nie do jakiegoś innego katalogu.
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} \'
}
To naiwne, ale musiałem sprawić, żeby było zgodne z POSIX. Wymaga pozwolenia na cd do katalogu pliku.
#!/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}
Podoba mi się wiele odpowiedzi już udzielonych, ale uważam to za bardzo przydatne, zwłaszcza w skrypcie, aby uzyskać pełną ścieżkę do pliku, w tym następujące dowiązania symboliczne i odnośniki względne, takie jak .i..
dirname `readlink -e relative/path/to/file`
Który zwróci pełną ścieżkę fileod ścieżki głównej w górę. Można tego użyć w skrypcie, aby skrypt wiedział, z której ścieżki biegnie, co jest przydatne w klonie repozytorium, który może znajdować się w dowolnym miejscu na komputerze.
basePath=`dirname \`readlink -e $0\``
Następnie mogę użyć ${basePath}zmiennej w moich skryptach, aby bezpośrednio odwoływać się do innych skryptów.
Ale wtedy ap ../foobar.txtda /home/user/../foobar.txt, co ogólnie nie jest tym, czego chcesz.
bdesham,
2
Również ap /tmp/foobar.txtda /home/user//tmp/foobar.txt, co jest nie tak.
David Biorąc pod uwagę
-1
find / -samefile file.txt -print
Znajduje wszystkie łącza do pliku o tym samym numerze i-węzła co plik.txt
dodanie -xdevflagi pozwoli uniknąć findprzekroczenia granic urządzenia („punktów montowania”). (Ale prawdopodobnie nie spowoduje to znalezienia niczego, jeśli findnie rozpocznie się w katalogu na tym samym urządzeniu cofile.txt )
Należy pamiętać, że findmoże zgłaszać wiele ścieżek dla jednego obiektu systemu plików, ponieważ i-węzeł może być połączony przez więcej niż jedną pozycję katalogu, być może nawet przy użyciu różnych nazw. Na przykład:
W przypadku systemu Mac OS, jeśli chcesz tylko uzyskać ścieżkę pliku w wyszukiwarce, kliknij plik i naciśnij klawisz przewijania w dół do „Usług” u dołu. Masz wiele możliwości, w tym „kopiuj ścieżkę” i „kopiuj pełną ścieżkę”. Kliknięcie jednego z nich powoduje umieszczenie ścieżki w schowku.
brew install coreutils
następniegreadlink -f file.txt
Podejrzewam, że używasz Linuksa.
Znalazłem narzędzie o nazwie
realpath
coreutils 8.15.Zgodnie z komentarzami @ styrofoam-fly i @ arch-standton,
realpath
samo nie sprawdza istnienia pliku, aby rozwiązać ten problem, dodaje
argument:realpath -e file
źródło
realpath
był zaangażowany w repozytorium coreutils pod koniec 2011 roku, wydanie 8.15 zostało zrobione w styczniu 2012 roku, odpowiedziałem na to pytanie (zreadlink
sugestią) w marcu 2011 roku :)realpath -e
wyświetla błąd, jeśli argument nie istnieje.Następuje zwykle załatwienie sprawy:
źródło
LOCAL_VARIABLE="filename.txt" && echo $(cd $(dirname "$LOCAL_VARIABLE") && pwd -P)/$(basename "$LOCAL_VARIABLE")
readlink
nie działa, jeśli plik jest dowiązaniem symbolicznym, pokaże cel dowiązania symbolicznego zamiast samego dowiązania symbolicznego.readlink
zabiera mnie z powrotem do katalogu nadrzędnego, z którego generowane jest dowiązanie symboliczne, ale to go ignoruje.set .. && echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
### Wyjście: / home / ravi / ..Ja wiem, istnieje prostszy sposób, że to, ale cholernie czy mogę go znaleźć ...
źródło
lub
źródło
find `pwd` -type file -name \*.dmp
Jeśli znajdujesz się w tym samym katalogu co plik:
Zamień
file.txt
na docelową nazwę pliku.źródło
echo $(pwd)/file.txt
W systemie Windows:
Shift
i kliknięcie pliku prawym przyciskiem myszy w Eksploratorze Windows daje opcję o nazwieCopy as Path
. Spowoduje to skopiowanie pełnej ścieżki pliku do schowka.W systemie Linux:
realpath yourfile
aby uzyskać pełną ścieżkę do pliku, jak sugerują inni.źródło
Wiem, że to jest stare pytanie, ale tylko po to, aby dodać tutaj informacje:
Polecenia Linux
which
można użyć do znalezienia ścieżki do pliku poleceń, tjIstnieją pewne zastrzeżenia do tego; proszę zobaczyć https://www.cyberciti.biz/faq/how-do-i-find-the-path-to-a-command-file/ .
źródło
Działa na komputerach Mac, Linux, * nix:
To da ci cytowany plik csv wszystkich plików w bieżącym katalogu:
Dane wyjściowe można łatwo skopiować na listę python lub dowolną podobną strukturę danych.
źródło
Możesz użyć skryptu fpn (pełna nazwa ścieżki) :
fpn
nie jest standardowym pakietem Linuksa, ale jest to darmowy i otwarty projekt github i możesz go skonfigurować za minutę .źródło
pwd
samo w sobie powinno działać dobrze w systemie Linux i większości innych uniksowych środowisk systemu operacyjnego.Możesz użyć tej funkcji. Jeśli nazwa pliku jest podana bez ścieżki względnej, zakłada się, że jest obecna w bieżącym katalogu roboczym:
Stosowanie:
Użycie ze ścieżką względną:
Ze spacjami w nazwie pliku:
źródło
W podobnym scenariuszu uruchamiam skrypt cshell z innej lokalizacji. Aby ustawić poprawną bezwzględną ścieżkę skryptu, tak aby działał on tylko w wyznaczonym katalogu, używam następującego kodu:
$0
przechowuje dokładny ciąg wykonania skryptu.Na przykład, jeśli skrypt został uruchomiony tak:
$> ../../test/test.csh
,$script_dir
będzie zawierał/home/abc/sandbox/v1/../../test
źródło
./test.csh
, będziesz mieć ścieżkę kończącą się na/test/.
W systemie Mac OS X zastąpiłem narzędzia dostarczane z systemem operacyjnym i zastąpiłem je nowszą wersją coreutils. Umożliwia to dostęp do narzędzi takich jak
readlink -f
(bezwzględna ścieżka do plików) irealpath
(bezwzględna ścieżka do katalogów) na komputerze Mac.Wersja Homebrew dołącza „G” (dla GNU Tools) przed nazwą polecenia - więc odpowiedniki stają się
greadlink -f FILE
igrealpath DIRECTORY
.Instrukcje dotyczące instalacji narzędzi coreutils / GNU w systemie Mac OS X za pośrednictwem Homebrew można znaleźć w tym artykule StackExchange .
Uwaga: Polecenia
readlink -f
irealpath
powinny działać od razu po wyjęciu z pudełka dla użytkowników systemów operacyjnych innych niż Mac.źródło
brew install coreutils
To jest wyjaśnienie tego, co się dzieje w @ ZeRemz za odpowiedź :
"$1"
dirname "$1"
cd "$(dirname "$1")
przechodzimy do tego względnego reż&& pwd -P
i uzyskać absolutną ścieżkę do tego.-P
opcja pozwoli uniknąć wszystkich dowiązań symbolicznych$(basename "$1")
echo
to myźródło
To działało całkiem dobrze dla mnie. Nie opiera się na systemie plików (za / przeciw w zależności od potrzeb), więc będzie szybki; i powinien być przenośny dla większości * NIX. Zakłada, że przekazany ciąg jest rzeczywiście względny do PWD, a nie do jakiegoś innego katalogu.
źródło
To naiwne, ale musiałem sprawić, żeby było zgodne z POSIX. Wymaga pozwolenia na cd do katalogu pliku.
źródło
Zazwyczaj:
Alternatywnie, tylko dla bieżącego folderu:
źródło
Podoba mi się wiele odpowiedzi już udzielonych, ale uważam to za bardzo przydatne, zwłaszcza w skrypcie, aby uzyskać pełną ścieżkę do pliku, w tym następujące dowiązania symboliczne i odnośniki względne, takie jak
.
i..
Który zwróci pełną ścieżkę
file
od ścieżki głównej w górę. Można tego użyć w skrypcie, aby skrypt wiedział, z której ścieżki biegnie, co jest przydatne w klonie repozytorium, który może znajdować się w dowolnym miejscu na komputerze.Następnie mogę użyć
${basePath}
zmiennej w moich skryptach, aby bezpośrednio odwoływać się do innych skryptów.Mam nadzieję że to pomoże,
Dave
źródło
Możesz zapisać to
shell.rc
w konsoli lub po prostu w konsoliprzykład:
wyjdzie
źródło
ap ../foobar.txt
da/home/user/../foobar.txt
, co ogólnie nie jest tym, czego chcesz.ap /tmp/foobar.txt
da/home/user//tmp/foobar.txt
, co jest nie tak.Znajduje wszystkie łącza do pliku o tym samym numerze i-węzła co plik.txt
dodanie
-xdev
flagi pozwoli uniknąćfind
przekroczenia granic urządzenia („punktów montowania”). (Ale prawdopodobnie nie spowoduje to znalezienia niczego, jeślifind
nie rozpocznie się w katalogu na tym samym urządzeniu cofile.txt
)Należy pamiętać, że
find
może zgłaszać wiele ścieżek dla jednego obiektu systemu plików, ponieważ i-węzeł może być połączony przez więcej niż jedną pozycję katalogu, być może nawet przy użyciu różnych nazw. Na przykład:Wyjdzie:
źródło
Będzie to działać zarówno dla pliku, jak i folderu:
źródło
Działa to zarówno z systemem Linux, jak i Mac OSX.
źródło
Kolejne narzędzie dla systemu Linux, które wykonuje tę pracę:
źródło
W przypadku systemu Mac OS, jeśli chcesz tylko uzyskać ścieżkę pliku w wyszukiwarce, kliknij plik i naciśnij klawisz przewijania w dół do „Usług” u dołu. Masz wiele możliwości, w tym „kopiuj ścieżkę” i „kopiuj pełną ścieżkę”. Kliknięcie jednego z nich powoduje umieszczenie ścieżki w schowku.
źródło
W Macu wspomniana poniżej linia działa. Nie musisz dodawać żadnych fantazyjnych linii.
źródło
print working directory
Kopiuje tekst do schowka i wyświetla tekst w oknie terminala.
:)
(Skopiowałem część kodu z innej odpowiedzi przepełnienia stosu, ale nie mogę już znaleźć tej odpowiedzi)
źródło
najłatwiej znalazłem
To działa dobrze dla mnie
źródło
W Mac OSX wykonaj następujące czynności:
cd
do katalogu pliku docelowego.file.txt
rzeczywistą nazwą pliku.źródło
Oprócz „readlink -f”, inne często używane polecenie:
Daje to również pełną ścieżkę i nazwę pliku na konsoli
Off-topic: Ta metoda daje tylko linki względne , a nie bezwzględne.
readlink -f
Komenda jest właściwa.źródło
Utwórz funkcję jak poniżej (echo ścieżki bezwzględnej pliku za pomocą pwd i dodaje plik na końcu ścieżki:
Teraz możesz po prostu znaleźć dowolną ścieżkę pliku:
źródło