Come ottenere il percorso completo di un file?


717

Esiste un modo semplice per stampare l'intero percorso file.txt?

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

Il <command>

dir> <command> file.txt  

dovrebbe stampare

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

Risposte:


1189

Usa readlink :

readlink -f file.txt

32
Ecco a cosa serve '-f'.
film


5
Appena testato il 10.9.2, funziona benissimo. quale readlink / usr / local / opt / coreutils / libexec / gnubin / readlink readlink --version readlink (GNU coreutils) 8.22
J0hnG4lt

10
@ J0hnG4lt: questo perché hai installato coreutils con homebrew e modificato il tuo PERCORSO in modo che punti ai binari non prefissati. Anche l'installazione di coreutils, lasciando solo PATH e usando "greadlink".
Tim Smith,

35
su MAC: installare homebrew quindi brew install coreutilspoigreadlink -f file.txt
Per Kra

217

Suppongo che tu stia usando Linux.

Ho trovato un'utilità chiamata realpathin coreutils 8.15.

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

Secondo i commenti di @ styrofoam-fly e @ arch-standton, realpathda solo non controlla l'esistenza del file, per risolvere questo aggiungere l' eargomento:realpath -e file


Funziona con cygwin (con la menta 2.7.9)
Scrambo,

1
realpathè stato impegnato nel repository coreutils alla fine del 2011, la versione 8.15 è stata effettuata a gennaio 2012, ho risposto alla domanda (con il readlinksuggerimento) nel marzo 2011 :)
filmor

2
realpath non controlla l'esistenza del file, ma risolve solo i percorsi. La richiesta di un percorso completo di un file non esistente dovrebbe causare un errore.
polistirolo vola

4
@styrofoamfly realpath -estampa un errore se l'argomento non esiste.
Arch Stanton,

76

Di solito il seguente è il trucco:

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

Ciao. Ho trovato questa risposta migliore per le mie esigenze. Puoi spiegare come posso usare una variabile locale invece del parametro della riga di comando (ovvero $ 1)
deeJ

1
LOCAL_VARIABLE="filename.txt" && echo $(cd $(dirname "$LOCAL_VARIABLE") && pwd -P)/$(basename "$LOCAL_VARIABLE")
stiemannkj1,

7
@SopalajodeArrierez Poiché readlinknon funziona se il file è un collegamento simbolico, ti mostrerà la destinazione del collegamento simbolico anziché il collegamento simbolico stesso.
qwertzguy,

1
Mi piace, perché readlinkmi riporta alla directory principale da cui viene generato il collegamento simbolico, ma questo lo ignora.
Sukhi,

set .. && echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1") ### Output: / home / ravi / ..
Tom Hale,

35

Io so che c'è un modo più semplice che questo, ma dannatamente se riesco a trovarlo ...

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

26
find $PWD -type f | grep "filename"

o

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

1
Per me, su Mac, ha funzionato - invece di $ pwd -find `pwd` -type file -name \*.dmp
mrwaim

14

Se ti trovi nella stessa directory del file:

ls "`pwd`/file.txt"

Sostituisci file.txtcon il tuo nome file di destinazione.


9
puoi anche fareecho $(pwd)/file.txt
Alex

12

Su Windows:

  • Tenendo premuto Shifte facendo clic con il pulsante destro del mouse su un file in Esplora risorse, si ottiene un'opzione chiamata Copy as Path. Questo copierà il percorso completo del file negli Appunti.

Su Linux:

  • È possibile utilizzare il comando realpath yourfileper ottenere il percorso completo di un file come suggerito da altri.

4

So che questa è una vecchia domanda ora, ma solo per aggiungere alle informazioni qui:

Il comando Linux whichpuò essere utilizzato per trovare il percorso del file di un file di comando, ad es

$ which ls
/bin/ls

Ci sono alcuni avvertimenti a questo; si prega di consultare https://www.cyberciti.biz/faq/how-do-i-find-the-path-to-a-command-file/ .


5
Questa risposta è troppo specifica, l'OP non riguarda la ricerca di comandi.
AL

4

Funziona su Mac, Linux, * nix:

Questo ti darà un csv citato di tutti i file nella directory corrente:

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

L'output di questo può essere facilmente copiato in un elenco Python o in qualsiasi struttura di dati simile.


stampa il percorso pwd corrente
Sand1512,

Sì, i percorsi completi separati da virgola per tutti i file in pwd, per un file basta fare ls 'nomefile' invece che solo 'ls'.
Bhargav Srinivasan,

3

È possibile utilizzare lo script fpn (nome percorso completo) :

% 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

fpnnon è un pacchetto Linux standard, ma è un progetto github gratuito e aperto e potresti installarlo in un minuto .


1
In generale, di pwdper sé dovrebbe funzionare bene su Linux e la maggior parte degli altri ambienti operativi simili a Unix.
karolus,

3

È possibile utilizzare questa funzione. Se il nome del file viene fornito senza percorso relativo, si presume che sia presente nella directory di lavoro corrente:

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

Uso:

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

Utilizzo con percorso relativo:

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

Con spazi nel nome del file:

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

2

In uno scenario simile, sto lanciando uno script cshell da qualche altra posizione. Per impostare il percorso assoluto corretto dello script in modo che venga eseguito solo nella directory designata, sto usando il seguente codice:

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

$0 memorizza la stringa esatta in cui è stato eseguito lo script.

Per esempio, se lo script è stato lanciato in questo modo: $> ../../test/test.csh, $script_dirconterrà/home/abc/sandbox/v1/../../test


votato per questo in quanto questo è il più semplice e pertinente. Tuttavia, se digiti ./test.csh, avrai un percorso che termina con/test/.
vinyll

2

Per Mac OS X, ho sostituito i programmi di utilità forniti con il sistema operativo e li ho sostituiti con una versione più recente di coreutils. Ciò ti consente di accedere a strumenti come readlink -f(per il percorso assoluto ai file) e realpath(percorso assoluto per le directory) sul tuo Mac.

La versione di Homebrew aggiunge una 'G' (per GNU Tools) davanti al nome del comando - così gli equivalenti diventano greadlink -f FILEe grealpath DIRECTORY.

Le istruzioni su come installare i coreutils / GNU Tools su Mac OS X tramite Homebrew sono disponibili in questo articolo StackExchange .

NB: I comandi readlink -fe realpathdovrebbero funzionare immediatamente per gli utenti Unix non Mac.


2
brew install coreutils
A Kra il

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

Questa è la spiegazione di ciò che sta succedendo alla risposta di @ ZeRemz :

  1. Questo script ottiene il percorso relativo come argomento "$1"
  2. Quindi otteniamo dirname parte di quel percorso (puoi passare dir o file a questo script):dirname "$1"
  3. Quindi entriamo cd "$(dirname "$1")in questa direzione relativa
  4. && pwd -Pe ottenere il percorso assoluto per questo. -PL'opzione eviterà tutti i collegamenti simbolici
  5. Dopodiché aggiungiamo basename al percorso assoluto:$(basename "$1")
  6. Come passo finale che echosi

1

Questo ha funzionato abbastanza bene per me. Non si basa sul file system (un pro / contro a seconda delle necessità), quindi sarà veloce; e dovrebbe essere portabile su quasi tutti i * NIX. Presuppone che la stringa passata sia effettivamente relativa al PWD e non a qualche altra directory.

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

Questo è ingenuo, ma ho dovuto renderlo conforme a POSIX. Richiede l'autorizzazione per eseguire il cd nella directory del file.

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

0

Generalmente:

find `pwd` | grep <filename>

In alternativa, solo per la cartella corrente:

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

hm perché l'odio?
sjas,

0

Mi piacciono molte delle risposte già fornite, ma l'ho trovato davvero utile, specialmente all'interno di uno script per ottenere il percorso completo di un file, inclusi i seguenti link simbolici e riferimenti relativi come .e..

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

Che restituirà il percorso completo del filedal percorso radice in poi. Questo può essere usato in uno script in modo che lo script sappia da quale percorso sta eseguendo, il che è utile in un clone del repository che potrebbe trovarsi ovunque su una macchina.

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

Posso quindi utilizzare la ${basePath}variabile nei miei script per fare riferimento direttamente ad altri script.

Spero che sia di aiuto,

Dave


0

Puoi salvarlo nella tua shell.rco semplicemente metterlo nella console

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

esempio:

ap somefile.txt

uscirà

/home/user/somefile.txt

3
Ma poi ap ../foobar.txtdarà /home/user/../foobar.txt, che non è generalmente quello che vuoi.
bdesham,

2
Inoltre ap /tmp/foobar.txtdarà /home/user//tmp/foobar.txt, che è sbagliato.
David, dato il

-1
find / -samefile file.txt -print

Troverà tutti i collegamenti al file con lo stesso numero di inode di file.txt

l'aggiunta di un -xdevflag eviterà finddi oltrepassare i confini del dispositivo ("punti di montaggio"). (Ma questo probabilmente non causerà nulla da trovare se findnon si avvia in una directory sullo stesso dispositivo di file.txt)

Si noti che findpuò segnalare più percorsi per un singolo oggetto filesystem, perché un Inode può essere collegato da più di una voce di directory, possibilmente anche usando nomi diversi. Per esempio:

find /bin -samefile /bin/gunzip -ls

Uscita:

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

-1

Questo funzionerà sia per il file che per la cartella:

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


-1

Un'altra utility Linux, che fa questo lavoro:

fname <file>

-1

Per Mac OS, se desideri semplicemente ottenere il percorso di un file nel Finder, controlla il clic sul file e scorri verso il basso fino a "Servizi" in fondo. Sono disponibili molte opzioni, tra cui "copia percorso" e "copia percorso completo". Facendo clic su uno di questi si inserisce il percorso negli Appunti.


-1

Nel mac menzionato sotto la linea funziona. Non c'è bisogno di aggiungere linee fantasiose.

> pwd filename

6
No stampa solo la directory di lavoro (senza il nome del file) come suggerisce il nome del comandoprint working directory
anilbey

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

Copia il testo negli appunti e visualizza il testo nella finestra del terminale.

:)

(Ho copiato parte del codice da un'altra risposta di overflow dello stack ma non riesco più a trovare quella risposta)


-2

il modo più semplice che ho trovato è

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

funziona bene per me


-2

In Mac OSX, procedere come segue:

  1. cd nella directory del file di destinazione.
  2. Digitare uno dei seguenti comandi del terminale.
terminale
ls "`pwd`/file.txt"
echo $(pwd)/file.txt
  1. Sostituisci file.txtcon il tuo nome file effettivo.
  2. stampa Enter

-3

Accanto a "readlink -f", un altro comando comunemente usato:

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

Ciò fornisce anche il percorso completo e il nome del file sulla console

Fuori tema: questo metodo fornisce solo collegamenti relativi , non assoluti. Il readlink -fcomando è quello giusto.


-3

Crea una funzione come la seguente (fa eco al percorso assoluto di un file con pwd e aggiunge il file alla fine del percorso:

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

Ora puoi trovare qualsiasi percorso di file:

abspath myfile.ext
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.