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.
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
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.
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
@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 ...
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.
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; }
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.
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} \'
}
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}
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.
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:
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.
brew install coreutils
danngreadlink -f file.txt
Ich nehme an, Sie verwenden Linux.
Ich habe ein Dienstprogramm namens
realpath
coreutils 8.15 gefunden.Gemäß den Kommentaren von @ styrofoam-fly und @ arch-standton wird
realpath
allein nicht geprüft, ob eine Datei vorhanden ist. Um dies zu lösen, fügen Sie das folgendee
Argument hinzu:realpath -e file
quelle
realpath
war verpflichtet, das Coreutils Repo Ende 2011, Release 8.15 wurde im Januar 2012 gemacht, ich beantwortete die Frage (mit demreadlink
Vorschlag) im März 2011 :)realpath -e
einen Fehler aus, wenn das Argument nicht vorhanden ist.Folgendes macht normalerweise den Trick:
quelle
LOCAL_VARIABLE="filename.txt" && echo $(cd $(dirname "$LOCAL_VARIABLE") && pwd -P)/$(basename "$LOCAL_VARIABLE")
readlink
dies nicht funktioniert, wenn es sich bei der Datei um einen Symlink handelt, wird anstelle des Symlinks selbst das Ziel des Symlinks angezeigt .readlink
ich zurück zum übergeordneten Verzeichnis komme, aus dem die symbolische Verknüpfung generiert wird, aber dies ignoriert es.set .. && echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
### Ausgabe: / home / ravi / ..Ich weiß, dass es einen einfacheren Weg gibt, aber verdammt, wenn ich ihn finden kann ...
quelle
oder
quelle
find `pwd` -type file -name \*.dmp
Wenn Sie sich im selben Verzeichnis wie die Datei befinden:
Ersetzen Sie
file.txt
durch Ihren Zieldateinamen.quelle
echo $(pwd)/file.txt
Unter Windows:
Shift
Sie im Windows Explorer eine Datei gedrückt halten und mit der rechten Maustaste darauf klicken, wird die Option aufgerufenCopy as Path
. Dadurch wird der vollständige Pfad der Datei in die Zwischenablage kopiert.Unter Linux:
realpath yourfile
Sie den vollständigen Pfad einer Datei abrufen, wie von anderen vorgeschlagen.quelle
Ich weiß, dass dies jetzt eine alte Frage ist, aber nur um die Informationen hier zu ergänzen:
Der Linux-Befehl
which
kann verwendet werden, um den Dateipfad einer Befehlsdatei zu finden, d. H.Es gibt einige Einschränkungen; Weitere Informationen finden Sie unter https://www.cyberciti.biz/faq/how-do-i-find-the-path-to-a-command-file/ .
quelle
Funktioniert unter Mac, Linux, * nix:
Dadurch erhalten Sie eine CSV-Datei aller Dateien im aktuellen Verzeichnis:
Die Ausgabe kann einfach in eine Python-Liste oder eine ähnliche Datenstruktur kopiert werden.
quelle
Sie können das Skript fpn (vollständiger Pfadname) verwenden :
fpn
ist kein Standard-Linux-Paket, aber es ist ein kostenloses und offenes Github-Projekt , das Sie in einer Minute einrichten können .quelle
pwd
sollte es unter Linux und den meisten anderen Unix-ähnlichen Betriebssystemumgebungen einwandfrei funktionieren.Sie können diese Funktion verwenden. Wenn der Dateiname ohne relativen Pfad angegeben wird, wird angenommen, dass er im aktuellen Arbeitsverzeichnis vorhanden ist:
Verwendungszweck:
Verwendung mit relativem Pfad:
Mit Leerzeichen im Dateinamen:
quelle
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:
$0
speichert die genaue Zeichenfolge, wie das Skript ausgeführt wurde.Zum Beispiel, wenn das Skript wie folgt gestartet wurde :
$> ../../test/test.csh
,$script_dir
enthält/home/abc/sandbox/v1/../../test
quelle
./test.csh
/test/.
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 FILE
und 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 -f
undrealpath
sollten für Nicht-Mac-Unix-Benutzer sofort funktionieren.quelle
brew install coreutils
Dies ist eine Erklärung dessen, was bei der Antwort von @ ZeRemz vor sich geht :
"$1"
dirname "$1"
cd "$(dirname "$1")
in dieses relative Verzeichnis&& pwd -P
und absoluten Weg dafür bekommen.-P
Option vermeidet alle Symlinks$(basename "$1")
echo
es geschafftquelle
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.
quelle
Das ist naiv, aber ich musste es machen, um POSIX-konform zu sein. Erfordert die Berechtigung zum CD in das Verzeichnis der Datei.
quelle
Meistens:
Alternativ nur für den aktuellen Ordner:
quelle
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..
Dadurch wird der vollständige Pfad von
file
ab 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.Ich kann dann das benutzen
${basePath}
Variable in meinen Skripten verwenden, um direkt auf andere Skripte zu verweisen.Hoffe das hilft,
Dave
quelle
Sie können dies in Ihrer
shell.rc
oder einfach in der Konsole speichernBeispiel:
wird ausgegeben
quelle
ap ../foobar.txt
wird geben/home/user/../foobar.txt
, was im Allgemeinen nicht das ist, was Sie wollen.ap /tmp/foobar.txt
wird geben/home/user//tmp/foobar.txt
, was falsch ist.Findet alle Links zu der Datei mit derselben Inode-Nummer wie file.txt
Durch Hinzufügen eines
-xdev
Flags wird vermiedenfind
, dass Gerätegrenzen überschritten werden ("Einhängepunkte"). (Dies führt jedoch wahrscheinlich dazu, dass nichts gefunden wird, wenn dasfind
nicht in einem Verzeichnis auf demselben Gerät wie gestartet wirdfile.txt
)Beachten Sie, dass
find
mehrere 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:Wird ausgegeben:
quelle
Dies funktioniert sowohl für Dateien als auch für Ordner:
quelle
Dies funktioniert sowohl mit Linux als auch mit Mac OS X.
quelle
Ein weiteres Linux-Dienstprogramm, das diesen Job erledigt:
quelle
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.
quelle
In Mac unten erwähnte Zeile funktioniert. Keine Notwendigkeit, irgendwelche ausgefallenen Linien hinzuzufügen.
quelle
print working directory
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.)
quelle
Der einfachste Weg, den ich gefunden habe, ist
es funktioniert gut für mich
quelle
Führen Sie unter Mac OS X die folgenden Schritte aus:
cd
in das Verzeichnis der Zieldatei.file.txt
durch Ihren tatsächlichen Dateinamen.quelle
Neben "readlink -f" ein weiterer häufig verwendeter Befehl:
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 -f
Befehl ist der richtige.quelle
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:
Jetzt können Sie einfach einen beliebigen Dateipfad finden:
quelle