Antworten:
Verwenden Sie readlink :
readlink -f file.txt
brew install coreutils
danngreadlink -f file.txt
Ich nehme an, Sie verwenden Linux.
Ich habe ein Dienstprogramm namens realpath
coreutils 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 realpath
allein nicht geprüft, ob eine Datei vorhanden ist. Um dies zu lösen, fügen Sie das folgende e
Argument hinzu:realpath -e file
realpath
war verpflichtet, das Coreutils Repo Ende 2011, Release 8.15 wurde im Januar 2012 gemacht, ich beantwortete die Frage (mit dem readlink
Vorschlag) im März 2011 :)
realpath -e
einen 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")
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 ...
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
Shift
Sie 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 yourfile
Sie 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 which
kann 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
fpn
ist kein Standard-Linux-Paket, aber es ist ein kostenloses und offenes Github-Projekt , das Sie in einer Minute einrichten können .
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:
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_dir
enthä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 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
und realpath
sollten 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 -P
und absoluten Weg dafür bekommen. -P
Option vermeidet alle Symlinks$(basename "$1")
echo
es 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 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.
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.rc
oder 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.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.
find / -samefile file.txt -print
Findet alle Links zu der Datei mit derselben Inode-Nummer wie file.txt
Durch Hinzufügen eines -xdev
Flags wird vermieden find
, dass Gerätegrenzen überschritten werden ("Einhängepunkte"). (Dies führt jedoch wahrscheinlich dazu, dass nichts gefunden wird, wenn das find
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:
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.txt
durch 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 -f
Befehl 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