Odpowiedzi:
Użyj readlink :
readlink -f file.txt
brew install coreutils
następniegreadlink -f file.txt
Podejrzewam, że używasz Linuksa.
Znalazłem narzędzie o nazwie realpath
coreutils 8.15.
realpath file.txt
/data/ail_data/transformed_binaries/coreutils/test_folder_realpath/file.txt
Zgodnie z komentarzami @ styrofoam-fly i @ arch-standton, realpath
samo nie sprawdza istnienia pliku, aby rozwiązać ten problem, dodaj e
argument:realpath -e file
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 (z readlink
sugestią) w marcu 2011 roku :)
realpath -e
wyświetla błąd, jeśli argument nie istnieje.
Następuje zwykle załatwienie sprawy:
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
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źć ...
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"
lub
find $PWD -type f -name "*filename*"
find `pwd` -type file -name \*.dmp
Shift
i 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.realpath yourfile
aby uzyskać pełną ścieżkę do pliku, jak sugerują inni.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ń, tj
$ which ls
/bin/ls
Istnieją pewne zastrzeżenia do tego; proszę zobaczyć https://www.cyberciti.biz/faq/how-do-i-find-the-path-to-a-command-file/ .
Działa na komputerach Mac, Linux, * nix:
To da ci cytowany plik csv wszystkich plików w bieżącym katalogu:
ls | xargs -I {} echo "$(pwd -P)/{}" | xargs | sed 's/ /","/g'
Dane wyjściowe można łatwo skopiować na listę python lub dowolną podobną strukturę danych.
Możesz użyć skryptu fpn (pełna nazwa ścieżki) :
% 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
nie jest standardowym pakietem Linuksa, ale jest to darmowy i otwarty projekt github i możesz go skonfigurować za minutę .
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:
abspath() { old=`pwd`;new=$(dirname "$1");if [ "$new" != "." ]; then cd $new; fi;file=`pwd`/$(basename "$1");cd $old;echo $file; }
Stosowanie:
$ abspath file.txt
/I/am/in/present/dir/file.txt
Użycie ze ścieżką względną:
$ abspath ../../some/dir/some-file.txt
/I/am/in/some/dir/some-file.txt
Ze spacjami w nazwie pliku:
$ abspath "../../some/dir/another file.txt"
/I/am/in/some/dir/another file.txt
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_dir
będzie zawierał/home/abc/sandbox/v1/../../test
./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) 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 FILE
i 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 -f
i realpath
powinny działać od razu po wyjęciu z pudełka dla użytkowników systemów operacyjnych innych niż Mac.
brew install coreutils
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
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 myTo 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ę 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.
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.
Mam nadzieję że to pomoże,
Dave
Możesz zapisać to shell.rc
w konsoli lub po prostu w konsoli
function absolute_path { echo "$PWD/$1"; }
alias ap="absolute_path"
przykład:
ap somefile.txt
wyjdzie
/home/user/somefile.txt
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.
find / -samefile file.txt -print
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śli find
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:
find /bin -samefile /bin/gunzip -ls
Wyjdzie:
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
Działa to zarówno z systemem Linux, jak i Mac OSX.
echo $(pwd)$/$(ls file.txt)
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.
W Macu wspomniana poniżej linia działa. Nie musisz dodawać żadnych fantazyjnych linii.
> pwd filename
print working directory
W Mac OSX wykonaj następujące czynności:
cd
do katalogu pliku docelowego.ls "`pwd`/file.txt"
echo $(pwd)/file.txt
file.txt
rzeczywistą nazwą pliku.Oprócz „readlink -f”, inne często używane polecenie:
$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 $
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.
Utwórz funkcję jak poniżej (echo ścieżki bezwzględnej pliku za pomocą pwd i dodaje plik na końcu ścieżki:
abspath() { echo $(pwd "$1")/"$1"; }
Teraz możesz po prostu znaleźć dowolną ścieżkę pliku:
abspath myfile.ext