Antworten:
Verwenden Sie readlink :
readlink -f file.txt
brew install coreutilsdanngreadlink -f file.txt
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
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 :)
realpath -eeinen Fehler aus, wenn das Argument nicht vorhanden ist.
Folgendes macht normalerweise den Trick:
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
LOCAL_VARIABLE="filename.txt" && echo $(cd $(dirname "$LOCAL_VARIABLE") && pwd -P)/$(basename "$LOCAL_VARIABLE")
readlinkdies nicht funktioniert, wenn es sich bei der Datei um einen Symlink handelt, wird anstelle des Symlinks selbst das Ziel des Symlinks angezeigt .
readlinkich 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 ...
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"
oder
find $PWD -type f -name "*filename*"
find `pwd` -type file -name \*.dmp
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.realpath yourfileSie den vollständigen Pfad einer Datei abrufen, wie von anderen vorgeschlagen.Ich weiß, dass dies jetzt eine alte Frage ist, aber nur um die Informationen hier zu ergänzen:
Der Linux-Befehl whichkann verwendet werden, um den Dateipfad einer Befehlsdatei zu finden, d. H.
$ which ls
/bin/ls
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/ .
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.
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 .
pwdsollte 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:
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
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
./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 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.
brew install coreutils
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
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 -Pund absoluten Weg dafür bekommen. -POption vermeidet alle Symlinks$(basename "$1")echoes geschafftDas 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.
Hoffe das hilft,
Dave
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
ap ../foobar.txtwird geben /home/user/../foobar.txt, was im Allgemeinen nicht das ist, was Sie wollen.
ap /tmp/foobar.txtwird geben /home/user//tmp/foobar.txt, was falsch ist.
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
Dies funktioniert sowohl mit Linux als auch mit Mac OS X.
echo $(pwd)$/$(ls file.txt)
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.
In Mac unten erwähnte Zeile funktioniert. Keine Notwendigkeit, irgendwelche ausgefallenen Linien hinzuzufügen.
> pwd filename
print working directory
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.)
Führen Sie unter Mac OS X die folgenden Schritte aus:
cd in das Verzeichnis der Zieldatei.ls "`pwd`/file.txt"
echo $(pwd)/file.txt
file.txtdurch Ihren tatsächlichen Dateinamen.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.
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