Wie erhalte ich den vollständigen Pfad einer Datei?


717

Gibt es eine einfache Möglichkeit, den vollständigen Pfad von zu drucken file.txt?

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

Das <command>

dir> <command> file.txt  

sollte drucken

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

Antworten:


1188

Verwenden Sie readlink :

readlink -f file.txt

32
Dafür ist '-f' da.
Filmemacher


5
Gerade am 10.9.2 getestet, funktioniert gut. welche readlink / usr / local / opt / coreutils / libexec / gnubin / readlink readlink --version readlink (GNU coreutils)
8.22

10
@ J0hnG4lt: Das liegt daran, dass Sie Coreutils mit Homebrew installiert und Ihren PATH so geändert haben, dass er auf die nicht fixierten Binärdateien verweist. Das Installieren von Coreutils, das Alleinlassen von PATH und die Verwendung von "greadlink" würden ebenfalls funktionieren.
Tim Smith

35
auf MAC: installieren Homebrew dann brew install coreutilsdanngreadlink -f file.txt
Um Kra

217

Ich nehme an, Sie verwenden Linux.

Ich habe ein Dienstprogramm namens realpathcoreutils 8.15 gefunden.

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

Gemäß den Kommentaren von @ styrofoam-fly und @ arch-standton wird realpathallein nicht geprüft, ob eine Datei vorhanden ist. Um dies zu lösen, fügen Sie das folgende eArgument hinzu:realpath -e file


Arbeitet mit Cygwin (mit Minze 2.7.9)
Scrambo

1
realpathwar verpflichtet, das Coreutils Repo Ende 2011, Release 8.15 wurde im Januar 2012 gemacht, ich beantwortete die Frage (mit dem readlinkVorschlag) im März 2011 :)
Filmor

2
realpath prüft nicht die Existenz der Datei, sondern löst nur Pfade auf. Das Abfragen eines vollständigen Pfads einer nicht vorhandenen Datei sollte zu einem Fehler führen.
Styropor fliegen

4
@styrofoamfly gibt realpath -eeinen Fehler aus, wenn das Argument nicht vorhanden ist.
Arch Stanton

76

Folgendes macht normalerweise den Trick:

 echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")

Hallo. Ich fand diese Antwort am besten zu meiner Anforderung. Können Sie erklären, wie ich eine lokale Variable anstelle eines Befehlszeilenparameters (dh $ 1) verwenden kann
deeJ

1
LOCAL_VARIABLE="filename.txt" && echo $(cd $(dirname "$LOCAL_VARIABLE") && pwd -P)/$(basename "$LOCAL_VARIABLE")
stiemannkj1

7
@SopalajodeArrierez Da readlinkdies nicht funktioniert, wenn es sich bei der Datei um einen Symlink handelt, wird anstelle des Symlinks selbst das Ziel des Symlinks angezeigt .
qwertzguy

1
Ich mag das, weil readlinkich zurück zum übergeordneten Verzeichnis komme, aus dem die symbolische Verknüpfung generiert wird, aber dies ignoriert es.
Sukhi

set .. && echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1") ### Ausgabe: / home / ravi / ..
Tom Hale

35

Ich weiß, dass es einen einfacheren Weg gibt, aber verdammt, wenn ich ihn finden kann ...

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

26
find $PWD -type f | grep "filename"

oder

find $PWD -type f -name "*filename*"

1
Für mich auf dem Mac funktionierte dies - anstelle von $ pwd -find `pwd` -type file -name \*.dmp
mrwaim

14

Wenn Sie sich im selben Verzeichnis wie die Datei befinden:

ls "`pwd`/file.txt"

Ersetzen Sie file.txtdurch Ihren Zieldateinamen.


9
Sie können auch tunecho $(pwd)/file.txt
Alex

12

Unter Windows:

  • Wenn ShiftSie im Windows Explorer eine Datei gedrückt halten und mit der rechten Maustaste darauf klicken, wird die Option aufgerufen Copy as Path. Dadurch wird der vollständige Pfad der Datei in die Zwischenablage kopiert.

Unter Linux:

  • Mit dem Befehl können realpath yourfileSie den vollständigen Pfad einer Datei abrufen, wie von anderen vorgeschlagen.


4

Funktioniert unter Mac, Linux, * nix:

Dadurch erhalten Sie eine CSV-Datei aller Dateien im aktuellen Verzeichnis:

ls | xargs -I {} echo "$(pwd -P)/{}" | xargs | sed 's/ /","/g'

Die Ausgabe kann einfach in eine Python-Liste oder eine ähnliche Datenstruktur kopiert werden.


druckt aktuellen pwd Pfad
Sand1512

Ja, durch Kommas getrennte vollständige Pfade für alle Dateien in pwd. Für eine Datei wird nur "Dateiname" anstelle von "ls" verwendet.
Bhargav Srinivasan

3

Sie können das Skript fpn (vollständiger Pfadname) verwenden :

% 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

fpnist kein Standard-Linux-Paket, aber es ist ein kostenloses und offenes Github-Projekt , das Sie in einer Minute einrichten können .


1
Im Allgemeinen pwdsollte es unter Linux und den meisten anderen Unix-ähnlichen Betriebssystemumgebungen einwandfrei funktionieren.
Karolus

3

Sie können diese Funktion verwenden. Wenn der Dateiname ohne relativen Pfad angegeben wird, wird angenommen, dass er im aktuellen Arbeitsverzeichnis vorhanden ist:

abspath() { old=`pwd`;new=$(dirname "$1");if [ "$new" != "." ]; then cd $new; fi;file=`pwd`/$(basename "$1");cd $old;echo $file; }

Verwendungszweck:

$ abspath file.txt
/I/am/in/present/dir/file.txt

Verwendung mit relativem Pfad:

$ abspath ../../some/dir/some-file.txt
/I/am/in/some/dir/some-file.txt

Mit Leerzeichen im Dateinamen:

$ abspath "../../some/dir/another file.txt"
/I/am/in/some/dir/another file.txt

2

In einem ähnlichen Szenario starte ich ein cshell-Skript von einem anderen Ort aus. Um den korrekten absoluten Pfad des Skripts so festzulegen, dass es nur im angegebenen Verzeichnis ausgeführt wird, verwende ich den folgenden Code:

set script_dir = `pwd`/`dirname $0`

$0 speichert die genaue Zeichenfolge, wie das Skript ausgeführt wurde.

Zum Beispiel, wenn das Skript wie folgt gestartet wurde : $> ../../test/test.csh, $script_direnthält/home/abc/sandbox/v1/../../test


stimmte dafür, da dies am einfachsten und relevantesten ist. Wenn Sie jedoch ./test.csh/test/.
eingeben,

2

Für Mac OS X habe ich die mit dem Betriebssystem gelieferten Dienstprogramme ersetzt und durch eine neuere Version von coreutils ersetzt. Auf diese Weise können Sie auf Tools wie readlink -f(für den absoluten Pfad zu Dateien) und zugreifenrealpath (für den absoluten Pfad zu Verzeichnissen) auf Ihrem Mac .

In der Homebrew-Version wird vor dem Befehlsnamen ein 'G' (für GNU Tools) angehängt, sodass die Entsprechungen zu greadlink -f FILEund werdengrealpath DIRECTORY .

Anweisungen zum Installieren der coreutils / GNU-Tools unter Mac OS X über Homebrew finden Sie in diesem Artikel zu StackExchange .

NB: Die Befehle readlink -fund realpathsollten für Nicht-Mac-Unix-Benutzer sofort funktionieren.


2
brew install coreutils
Zu Kra

2
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")

Dies ist eine Erklärung dessen, was bei der Antwort von @ ZeRemz vor sich geht :

  1. Dieses Skript erhält einen relativen Pfad als Argument "$1"
  2. Dann bekommen wir dirname Teil dieses Weges (können Sie entweder dir oder die Datei zu diesem Skript übergeben):dirname "$1"
  3. Dann gehen wir cd "$(dirname "$1")in dieses relative Verzeichnis
  4. && pwd -Pund absoluten Weg dafür bekommen. -POption vermeidet alle Symlinks
  5. Danach hängen wir den Basisnamen an den absoluten Pfad an:$(basename "$1")
  6. Als letzten Schritt haben wir echoes geschafft

1

Das hat bei mir ganz gut funktioniert. Es hängt nicht vom Dateisystem ab (je nach Bedarf ein Pro / Contra), daher ist es schnell; und es sollte für die meisten * NIX portabel sein. Es wird davon ausgegangen, dass die übergebene Zeichenfolge tatsächlich relativ zur PWD und nicht zu einem anderen Verzeichnis ist.

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} \'
}

1

Das ist naiv, aber ich musste es machen, um POSIX-konform zu sein. Erfordert die Berechtigung zum CD in das Verzeichnis der Datei.

#!/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}

0

Meistens:

find `pwd` | grep <filename>

Alternativ nur für den aktuellen Ordner:

find `pwd` -maxdepth 1 | grep <filename>

hm warum der Hass?
Sjas

0

Ich mag viele der bereits gegebenen Antworten, aber ich habe dies als sehr nützlich empfunden, insbesondere innerhalb eines Skripts, um den vollständigen Pfad einer Datei abzurufen, einschließlich der folgenden Symlinks und relativen Verweise wie .und..

dirname `readlink -e relative/path/to/file`

Dadurch wird der vollständige Pfad von fileab dem Root-Pfad zurückgegeben. Dies kann in einem Skript verwendet werden, damit das Skript weiß, von welchem ​​Pfad es ausgeführt wird. Dies ist in einem Repository-Klon hilfreich, der sich an einer beliebigen Stelle auf einem Computer befinden kann.

basePath=`dirname \`readlink -e $0\``

Ich kann dann das benutzen ${basePath} Variable in meinen Skripten verwenden, um direkt auf andere Skripte zu verweisen.

Hoffe das hilft,

Dave


0

Sie können dies in Ihrer shell.rcoder einfach in der Konsole speichern

function absolute_path { echo "$PWD/$1"; }
alias ap="absolute_path"

Beispiel:

ap somefile.txt

wird ausgegeben

/home/user/somefile.txt

3
Aber dann ap ../foobar.txtwird geben /home/user/../foobar.txt, was im Allgemeinen nicht das ist, was Sie wollen.
Bdesham

2
Auch ap /tmp/foobar.txtwird geben /home/user//tmp/foobar.txt, was falsch ist.
David gegeben

-1
find / -samefile file.txt -print

Findet alle Links zu der Datei mit derselben Inode-Nummer wie file.txt

Durch Hinzufügen eines -xdevFlags wird vermieden find, dass Gerätegrenzen überschritten werden ("Einhängepunkte"). (Dies führt jedoch wahrscheinlich dazu, dass nichts gefunden wird, wenn das findnicht in einem Verzeichnis auf demselben Gerät wie gestartet wirdfile.txt )

Beachten Sie, dass findmehrere Pfade für ein einzelnes Dateisystemobjekt gemeldet werden können, da ein Inode durch mehr als einen Verzeichniseintrag verknüpft werden kann, möglicherweise sogar unter Verwendung unterschiedlicher Namen. Zum Beispiel:

find /bin -samefile /bin/gunzip -ls

Wird ausgegeben:

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

-1

Dies funktioniert sowohl für Dateien als auch für Ordner:

getAbsolutePath(){
    [[ -d $1 ]] && { cd "$1"; echo "$(pwd -P)"; } || 
    { cd "$(dirname "$1")" || exit 1; echo "$(pwd -P)/$(basename "$1")"; }
}

-1

Dies funktioniert sowohl mit Linux als auch mit Mac OS X.

 echo $(pwd)$/$(ls file.txt)

-1

Ein weiteres Linux-Dienstprogramm, das diesen Job erledigt:

fname <file>

-1

Wenn Sie unter Mac OS nur den Pfad einer Datei im Finder abrufen möchten, klicken Sie bei gedrückter Ctrl-Taste auf die Datei und scrollen Sie unten zu "Dienste". Sie haben viele Möglichkeiten, einschließlich "Pfad kopieren" und "vollständigen Pfad kopieren". Wenn Sie auf eine dieser Optionen klicken, wird der Pfad in die Zwischenablage verschoben.


-1

In Mac unten erwähnte Zeile funktioniert. Keine Notwendigkeit, irgendwelche ausgefallenen Linien hinzuzufügen.

> pwd filename

6
Nein, es wird nur das Arbeitsverzeichnis (ohne den Dateinamen) print working directory
gedruckt,

-2
fp () {
PHYS_DIR=`pwd -P`
RESULT=$PHYS_DIR/$1
echo $RESULT | pbcopy
echo $RESULT
}

Kopiert den Text in Ihre Zwischenablage und zeigt den Text im Terminalfenster an.

:) :)

(Ich habe einen Teil des Codes aus einer anderen Stapelüberlaufantwort kopiert, kann diese Antwort jedoch nicht mehr finden.)


-2

Der einfachste Weg, den ich gefunden habe, ist

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

es funktioniert gut für mich


-2

Führen Sie unter Mac OS X die folgenden Schritte aus:

  1. cd in das Verzeichnis der Zieldatei.
  2. Geben Sie einen der folgenden Terminalbefehle ein.
Terminal
ls "`pwd`/file.txt"
echo $(pwd)/file.txt
  1. Ersetzen Sie file.txtdurch Ihren tatsächlichen Dateinamen.
  2. Drücken Sie Enter

-3

Neben "readlink -f" ein weiterer häufig verwendeter Befehl:

$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
$

Dies gibt auch den vollständigen Pfad und den Dateinamen an der Konsole an

Off-Topic: Diese Methode gibt nur relative Links, nicht absolute. Der readlink -fBefehl ist der richtige.


-3

Erstellen Sie eine Funktion wie die folgende (gibt den absoluten Pfad einer Datei mit pwd wieder und fügt die Datei am Ende des Pfads hinzu:

abspath() { echo $(pwd "$1")/"$1"; }

Jetzt können Sie einfach einen beliebigen Dateipfad finden:

abspath myfile.ext
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.