Jak uzyskać pełną ścieżkę do pliku?

717

Czy istnieje prosty sposób na wydrukowanie pełnej ścieżki file.txt ?

file.txt = /nfs/an/disks/jj/home/dir/file.txt

The <command>

dir> <command> file.txt  

powinien wydrukować

/nfs/an/disks/jj/home/dir/file.txt
Drelich
źródło

Odpowiedzi:

1187

Użyj readlink :

readlink -f file.txt
filmowiec
źródło
32
Po to jest „-f”.
filmowiec
5
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.

realpath file.txt
/data/ail_data/transformed_binaries/coreutils/test_folder_realpath/file.txt

Zgodnie z komentarzami @ styrofoam-fly i @ arch-standton, realpathsamo nie sprawdza istnienia pliku, aby rozwiązać ten problem, dodaj eargument:realpath -e file

lllllllllllll
źródło
Współpracuje z cygwinem (z miętą 2.7.9)
Scrambo,
1
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.
Arch Stanton,
76

Następuje zwykle załatwienie sprawy:

 echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
ZeRemz
źródło
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 $)
deeJ
1
LOCAL_VARIABLE="filename.txt" && echo $(cd $(dirname "$LOCAL_VARIABLE") && pwd -P)/$(basename "$LOCAL_VARIABLE")
stiemannkj1
7
@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źć ...

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
jcomeau_ictx
źródło
26
find $PWD -type f | grep "filename"

lub

find $PWD -type f -name "*filename*"
Anshul Gupta
źródło
1
Dla mnie na find `pwd` -type file -name \*.dmp
Macu
14

Jeśli znajdujesz się w tym samym katalogu co plik:

ls "`pwd`/file.txt"

Zamień file.txtna docelową nazwę pliku.

Steven
źródło
9
możesz także zrobićecho $(pwd)/file.txt
Alex
12

W systemie Windows:

  • 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.
Natesh bhat
źródło
4

Wiem, że to jest stare pytanie, ale tylko po to, aby dodać tutaj informacje:

Polecenia Linux whichmoż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/ .

Lord Cat
źródło
5
Ta odpowiedź jest zbyt szczegółowa, OP nie polega na znajdowaniu poleceń.
AL
4

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.

Bhargav Srinivasan
źródło
wyświetla aktualną ścieżkę pwd
Sand1512,
Tak, pełne ścieżki oddzielone przecinkami dla wszystkich plików w pwd, dla pliku po prostu wpisz ls „filename” zamiast po prostu „ls”.
Bhargav Srinivasan
3

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

fpnnie jest standardowym pakietem Linuksa, ale jest to darmowy i otwarty projekt github i możesz go skonfigurować za minutę .

Adam Matan
źródło
1
Ogólnie rzecz biorąc, pwdsamo w sobie powinno działać dobrze w systemie Linux i większości innych uniksowych środowisk systemu operacyjnego.
karolus
3

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
Ramu
źródło
2

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

Ackq
źródło
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.

JacobWuzHere
źródło
2
brew install coreutils
Do Kra
2
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")

To jest wyjaśnienie tego, co się dzieje w @ ZeRemz za odpowiedź :

  1. Ten skrypt pobiera ścieżkę względną jako argument "$1"
  2. Następnie otrzymujemy dirname część tej ścieżki (możesz przekazać katalog lub plik do tego skryptu):dirname "$1"
  3. Następnie cd "$(dirname "$1")przechodzimy do tego względnego reż
  4. && pwd -Pi uzyskać absolutną ścieżkę do tego. -Popcja pozwoli uniknąć wszystkich dowiązań symbolicznych
  5. Następnie dodajemy basename do ścieżki bezwzględnej:$(basename "$1")
  6. Jako ostatni krok echoto my
Eugen Konkov
źródło
1

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} \'
}
Russell Speight
źródło
1

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}
Andrew Miller
źródło
0

Zazwyczaj:

find `pwd` | grep <filename>

Alternatywnie, tylko dla bieżącego folderu:

find `pwd` -maxdepth 1 | grep <filename>
sjas
źródło
hm, dlaczego nienawiść?
sjas,
0

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.

Mam nadzieję że to pomoże,

Dave

Dave Rix
źródło
0

Możesz zapisać to shell.rcw 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
Roman Rhrn Niestierow
źródło
3
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:

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
wildplasser
źródło
-1

Będzie to działać zarówno dla pliku, jak i folderu:

getAbsolutePath(){
    [[ -d $1 ]] && { cd "$1"; echo "$(pwd -P)"; } || 
    { cd "$(dirname "$1")" || exit 1; echo "$(pwd -P)/$(basename "$1")"; }
}
Jahid
źródło
-1

Działa to zarówno z systemem Linux, jak i Mac OSX.

 echo $(pwd)$/$(ls file.txt)
Ahmed Abobakr
źródło
-1

Kolejne narzędzie dla systemu Linux, które wykonuje tę pracę:

fname <file>
BluVio
źródło
-1

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.

Richard Sharpe
źródło
-1

W Macu wspomniana poniżej linia działa. Nie musisz dodawać żadnych fantazyjnych linii.

> pwd filename
Sanjeet kumar
źródło
6
Nie, po prostu drukuje katalog roboczy (bez nazwy pliku), jak sugeruje nazwa poleceniaprint working directory
anilbey
-2
fp () {
PHYS_DIR=`pwd -P`
RESULT=$PHYS_DIR/$1
echo $RESULT | pbcopy
echo $RESULT
}

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)

Dhruv
źródło
-2

najłatwiej znalazłem

for i in `ls`; do echo "`pwd`/$i"; done

To działa dobrze dla mnie

onkar
źródło
-2

W Mac OSX wykonaj następujące czynności:

  1. cd do katalogu pliku docelowego.
  2. Wpisz jedno z następujących poleceń terminalu.
Terminal
ls "`pwd`/file.txt"
echo $(pwd)/file.txt
  1. Zastąpić file.txt rzeczywistą nazwą pliku.
  2. naciśnij Enter
Pozwól mi o tym zadzwonić
źródło
-3

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 -fKomenda jest właściwa.

Andrew_1510
źródło
-3

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
Nestor Urquiza
źródło