it-swarm.com.de

Wie erhalte ich den vollständigen Pfad einer Datei?

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

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

Der <command>

dir> <command> file.txt  

sollte drucken

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

Verwenden Sie readlink :

readlink -f file.txt
1052
filmor

Ich nehme an, Sie verwenden Linux.

Ich habe in coreutils 8.15 ein Hilfsprogramm namens realpath gefunden.

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

Gemäß @ styrofoam-fly- und @ Arch-standton-Kommentaren prüft realpath allein nicht auf das Vorhandensein von Dateien. Um dieses Problem zu lösen, fügen Sie das e-Argument hinzu: realpath -e file

172
lllllllllllll

Das Folgende macht normalerweise den Trick:

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

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

[email protected]:~$ python -c 'import os; print(os.path.abspath("cat.wav"))'
/home/jcomeau/cat.wav

[email protected]:~$ ls $PWD/cat.wav
/home/jcomeau/cat.wav
29
jcomeau_ictx
find $PWD -type f | grep "filename"

oder

find $PWD -type f -name "*filename*"
22
Anshul Gupta

Wenn Sie sich im selben Verzeichnis wie die Datei befinden:

ls "`pwd`/file.txt"

Ersetzen Sie file.txt durch Ihren Zieldateinamen.

11
Steven

In Windows können Sie:

  • Halten Sie die Umschalttaste gedrückt und klicken Sie mit der rechten Maustaste auf eine Datei, die die Option "Copy as Path" enthält.

    Dadurch wird der vollständige Pfad der Datei in die Zwischenablage kopiert.

Unter Linux können Sie den folgenden Befehl verwenden:

  • realpath yourfile, um den vollständigen Pfad einer Datei abzurufen, wie von vielen vorgeschlagen.
10
Natesh bhat

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 Vorbehalte dazu; siehe https://www.cyberciti.biz/faq/how-do-i-find-the-path-to-a-command-file/ .

5
Lord Cat

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 freies und offenes Github-Projekt und Sie könnten es in einer Minute einrichten .

3
Adam Matan

Funktioniert unter Mac, Linux, * nix:

Dies gibt Ihnen eine zitierte csv aller Dateien im aktuellen Verzeichnis:

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

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

3

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

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

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

NB: Die Befehle readlink -f und realpath sollten für Nicht-Mac-Unix-Benutzer sofort einsatzbereit sein.

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

Dies ist eine Erklärung dafür, was bei @ ZeRemz passiert Antwort :

  1. Dieses Skript erhält den relativen Pfad als Argument "$1"
  2. Dann erhalten wir dirname Teil dieses Pfades (Sie können diesem Skript entweder dir oder file übergeben): dirname "$1"
  3. Dann cd "$(dirname "$1") wir in diese relative Richtung
  4. && pwd -P und absoluten Pfad dafür bekommen. Die Option -P vermeidet alle Symlinks
  5. Danach hängen wir den Basisnamen an den absoluten Pfad an: $(basename "$1")
  6. Als letzten Schritt haben wir es echo
2
Eugen Konkov

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, in der das Skript ausgeführt wurde.

Für z.B. Wenn das Skript wie folgt gestartet wurde: $> ../../test/test.csh, $script_dir enthält /home/abc/sandbox/v1/../../test

2
Ackq

Das ist naiv, aber ich musste es POSIX-konform machen. Erfordert die Erlaubnis, in das Verzeichnis der Datei zu cden.

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

Das hat bei mir ganz gut geklappt. Es ist nicht auf das Dateisystem angewiesen (Pro/Contra je nach Bedarf), daher ist es schnell. und es sollte auf die meisten * NIX portierbar 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
Russell Speight

Sie können diese Funktion verwenden. Wenn der Dateiname ohne relativen Pfad angegeben wird, wird davon ausgegangen, 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
1
Ramu

Auf dem unten genannten Mac funktioniert die Zeile. Es müssen keine ausgefallenen Linien hinzugefügt werden.

> pwd filename
0
Sanjeet kumar

Sie können dies in Ihrer "Shell.rc" speichern oder einfach in die Konsole stellen

function absolute_path {echo "$ PWD/$ 1"; }

alias ap = "absoluter_pfad"

beispiel:

ap somefile.txt

wird ausgegeben

/home/user/somefile.txt

0