Hoe krijg ik het volledige pad van een bestand?

Is er een gemakkelijke manier om het volledige pad van file.txtaf te drukken?

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

De <command>

dir> <command> file.txt  

moet afdrukken

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

Antwoord 1, autoriteit 100%

Gebruik readlink:

readlink -f file.txt

Antwoord 2, autoriteit 21%

Ik neem aan dat je Linux gebruikt.

Ik heb een hulpprogramma gevonden met de naam realpathin coreutils 8.15.

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

Volgens de opmerkingen van @styrofoam-fly en @arch-standton, controleert realpathalleen niet op het bestaan van bestanden. Om dit op te lossen, voegt u het argument etoe: realpath -e file


Antwoord 3, autoriteit 6%

Het volgende werkt meestal:

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

Antwoord 4, autoriteit 3%

Ik weetdat er een eenvoudigere manier is om dit te doen, maar verdorie als ik het kan vinden…

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

Antwoord 5, autoriteit 2%

find $PWD -type f | grep "filename"

of

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

Antwoord 6, autoriteit 2%

Op Windows:

  • Als u Shiftingedrukt houdt en met de rechtermuisknop op een bestand in Windows Verkenner klikt, krijgt u een optie genaamd Copy as Path.
    Hiermee wordt het volledige pad van het bestand naar het klembord gekopieerd.

Op Linux:

  • Je kunt het commando realpath yourfilegebruiken om het volledige pad van een bestand te krijgen, zoals voorgesteld door anderen.

Antwoord 7

Als u zich in dezelfde map bevindt als het bestand:

ls "`pwd`/file.txt"

Vervang file.txtdoor uw doelbestandsnaam.


Antwoord 8

Je zou het fpn (volledige padnaam)-script kunnen gebruiken:

% 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

fpnis geen standaard Linux-pakket, maar het is een gratis en open github-projecten jij zou het in een minuut kunnen instellen.


Antwoord 9

Ik weet dat dit nu een oude vraag is, maar om de informatie hier aan te vullen:

De Linux-opdracht whichkan worden gebruikt om het bestandspad van een opdrachtbestand te vinden, d.w.z.

$ which ls
/bin/ls

Hierbij zijn enkele kanttekeningen te plaatsen; zie https:/ /www.cyberciti.biz/faq/how-do-i-find-the-path-to-a-command-file/.


Antwoord 10

Werkt op Mac, Linux, *nix:

Dit geeft je een csv met aanhalingstekens van alle bestanden in de huidige map:

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

De uitvoer hiervan kan eenvoudig worden gekopieerd naar een pythonlijst of een vergelijkbare gegevensstructuur.


Antwoord 11

U kunt deze functie gebruiken. Als de bestandsnaam wordt gegeven zonder relatief pad, wordt aangenomen dat deze aanwezig is in de huidige werkdirectory:

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

Gebruik:

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

Gebruik met relatief pad:

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

Met spaties in bestandsnaam:

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

Antwoord 12

Je kunt dit opslaan in je shell.rcof gewoon in console

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

voorbeeld:

ap somefile.txt

uitvoert

/home/user/somefile.txt

Antwoord 13

In een soortgelijk scenario start ik een cshell-script vanaf een andere locatie. Voor het instellen van het juiste absolute pad van het script zodat het alleen in de aangewezen map wordt uitgevoerd, gebruik ik de volgende code:

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

$0slaat de exacte tekenreeks op hoe het script werd uitgevoerd.

Voor bijv. als het script als volgt is gestart: $> ../../test/test.csh,
$script_dirbevat /home/abc/sandbox/v1/../../test


Antwoord 14

Voor Mac OS X heb ik de hulpprogramma’s die bij het besturingssysteem zijn geleverd vervangen door een nieuwere versie van coreutils. Dit geeft je toegang tot tools zoals readlink -f(voor absoluut pad naar bestanden) en realpath(absoluut pad naar mappen) op je Mac.

De Homebrew-versie voegt een ‘G’ (voor GNU Tools) toe voor de opdrachtnaam — dus de equivalenten worden greadlink -f FILEen grealpath DIRECTORY.

Instructies voor het installeren van de coreutils/GNU Tools op Mac OS X via Homebrew zijn te vinden in dit StackExchange-artikel.

NB: De commando’s readlink -fen realpathzouden standaard moeten werken voor niet-Mac Unix-gebruikers.


Antwoord 15

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

Dit is een uitleg van wat er aan de hand is in het antwoordvan @ZeRemz:

  1. Dit script krijgt een relatief pad als argument "$1"
  2. Dan krijgen we dirnameeen deel van dat pad (je kunt dir of bestand aan dit script doorgeven): dirname "$1"
  3. Vervolgens cd "$(dirname "$1")in deze relatieve map
  4. && pwd -Pen krijg er een absoluut pad voor. -Poptie vermijdt alle symbolische links
  5. Daarna voegen we basenametoe aan het absolute pad: $(basename "$1")
  6. Als laatste stap echohet

Antwoord 16

Dit werkte best goed voor mij. Het is niet op het bestandssysteem (een pro / con afhankelijk van de behoefte), dus het zal snel zijn; En, het moet draagbaar zijn voor de meeste * NIX. Het neemt aan dat de doorgegeven string inderdaad ten opzichte van de PWD is en niet een andere map.

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

Antwoord 17

Dit is naïef, maar ik moest het MOSIX-compliant maken. Vereist toestemming aan CD in de map van het bestand.

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

Antwoord 18

find / -samefile file.txt -print

vindt alle links naar het bestand met hetzelfde inode nummer als bestand.txt

Het toevoegen van een -xdevvlag vermijdt findom apparaatgrenzen over te steken (“Mount Points”). (Maar dit zal waarschijnlijk niets te vinden zijn als de findniet start in een map op hetzelfde apparaat als file.txt)

Houd er rekening mee dat findmeerdere paden kunnen melden voor een enkel bestandssysteemobject, omdat een inode kan worden gekoppeld door meer dan één directory-invoer, mogelijk zelfs met behulp van verschillende namen. Bijvoorbeeld:

find /bin -samefile /bin/gunzip -ls

wordt uitgevoerd:

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

Antwoord 19

Meestal:

find `pwd` | grep <filename>

Alternatief, alleen voor de huidige map:

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

Antwoord 20

Ik hou van veel van de reeds gegeven antwoorden, maar ik heb dit echt nuttig gevonden, vooral binnen een script om het volledige pad van een bestand te krijgen, inclusief de volgende symlinks en relatieve referenties zoals .en ..

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

die het volledige pad van de filevan het root-pad retourneren.
Dit kan in een script worden gebruikt, zodat het script weet welk pad het loopt, wat handig is in een repository-kloon die ergens op een machine kan worden geplaatst.

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

Ik kan vervolgens de ${basePath}-variabele in Mijn scripts gebruiken om rechtstreeks andere scripts te verwijzen.

Ik hoop dat dit helpt,

DAVE


Antwoord 21

Dit werkt met zowel Linux als Mac OSX ..

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

Antwoord 22

Dit werkt voor zowel bestand als map:

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

Antwoord 23

Nog een Linux-hulpprogramma, dat doet deze taak:

fname <file>

Antwoord 24

Voor Mac OS, als u gewoon het pad van een bestand in de Finder wilt ontvangen, klikt u op het bestand en scrolt u naar “Services” onderaan. Je krijgt veel keuzes, waaronder “Pad Copy Path” en “Copy Full Path”. Als u op een van deze klikt, wordt het pad op het klembord geplaatst.


Antwoord 25

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

Kopieert de tekst naar uw klembord en geeft de tekst weer op het terminalvenster.

🙂

(ik heb een deel van de code gekopieerd van een ander stack overflow antwoord, maar kan dat antwoord niet meer vinden)


Antwoord 26

De eenvoudigste manier waarop ik heb gevonden, is

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

het werkt goed voor mij


Antwoord 27

In Mac OSX doet de volgende stappen:

  1. cdin de map van het doelbestand.
  2. Typ een van de volgende terminalopdrachten.

Terminal

ls "`pwd`/file.txt"
echo $(pwd)/file.txt
  1. Vervang file.txtmet uw werkelijke bestandsnaam.
  2. Druk op ENTER

Antwoord 28

Naast "readlink -f" , een ander veelgebruikt commando:

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

Dit geeft ook het volledige pad en de bestandsnaam op de console

Off-topic: deze methode geeft alleen relatievelinks, geen absolute. De opdracht readlink -fis de juiste.


Antwoord 29

Maak een functie zoals de onderstaande (echot het absolute pad van een bestand met pwd en voegt het bestand toe aan het einde van het pad:

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

Je kunt nu elk bestandspad vinden:

abspath myfile.ext

Antwoord 30

Om het volledige pad van een bestand te krijgen:

1) open uw terminal in de map met uw bestand, door op de volgende toetsen op het toetsenbord te drukken:

CTRL+ ALT+ T

2) typ vervolgens "pwd" (acroniem van Print naam van Working Directory):

your@device ~ $ pwd

dat is alles mensen!

Other episodes