Risposte:
Usa readlink :
readlink -f file.txt
brew install coreutils
poigreadlink -f file.txt
Suppongo che tu stia usando Linux.
Ho trovato un'utilità chiamata realpath
in 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, realpath
da solo non controlla l'esistenza del file, per risolvere questo aggiungere l' e
argomento:realpath -e file
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 readlink
suggerimento) nel marzo 2011 :)
realpath -e
stampa un errore se l'argomento non esiste.
Di solito il seguente è il trucco:
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
LOCAL_VARIABLE="filename.txt" && echo $(cd $(dirname "$LOCAL_VARIABLE") && pwd -P)/$(basename "$LOCAL_VARIABLE")
readlink
non funziona se il file è un collegamento simbolico, ti mostrerà la destinazione del collegamento simbolico anziché il collegamento simbolico stesso.
readlink
mi riporta alla directory principale da cui viene generato il collegamento simbolico, ma questo lo ignora.
set .. && echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
### Output: / home / ravi / ..
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
find $PWD -type f | grep "filename"
o
find $PWD -type f -name "*filename*"
find `pwd` -type file -name \*.dmp
Shift
e 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.realpath yourfile
per ottenere il percorso completo di un file come suggerito da altri.So che questa è una vecchia domanda ora, ma solo per aggiungere alle informazioni qui:
Il comando Linux which
può 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/ .
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.
È 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
fpn
non è un pacchetto Linux standard, ma è un progetto github gratuito e aperto e potresti installarlo in un minuto .
pwd
per sé dovrebbe funzionare bene su Linux e la maggior parte degli altri ambienti operativi simili a Unix.
È 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
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_dir
conterrà/home/abc/sandbox/v1/../../test
./test.csh
, avrai un percorso che termina con/test/.
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 FILE
e 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 -f
e realpath
dovrebbero funzionare immediatamente per gli utenti Unix non Mac.
brew install coreutils
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
Questa è la spiegazione di ciò che sta succedendo alla risposta di @ ZeRemz :
"$1"
dirname "$1"
cd "$(dirname "$1")
in questa direzione relativa&& pwd -P
e ottenere il percorso assoluto per questo. -P
L'opzione eviterà tutti i collegamenti simbolici$(basename "$1")
echo
siQuesto 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} \'
}
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}
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 file
dal 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
Puoi salvarlo nella tua shell.rc
o semplicemente metterlo nella console
function absolute_path { echo "$PWD/$1"; }
alias ap="absolute_path"
esempio:
ap somefile.txt
uscirà
/home/user/somefile.txt
ap ../foobar.txt
darà /home/user/../foobar.txt
, che non è generalmente quello che vuoi.
ap /tmp/foobar.txt
darà /home/user//tmp/foobar.txt
, che è sbagliato.
find / -samefile file.txt -print
Troverà tutti i collegamenti al file con lo stesso numero di inode di file.txt
l'aggiunta di un -xdev
flag eviterà find
di oltrepassare i confini del dispositivo ("punti di montaggio"). (Ma questo probabilmente non causerà nulla da trovare se find
non si avvia in una directory sullo stesso dispositivo di file.txt
)
Si noti che find
può 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
Funziona con Linux e Mac OSX.
echo $(pwd)$/$(ls file.txt)
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.
Nel mac menzionato sotto la linea funziona. Non c'è bisogno di aggiungere linee fantasiose.
> pwd filename
print working directory
In Mac OSX, procedere come segue:
cd
nella directory del file di destinazione.ls "`pwd`/file.txt"
echo $(pwd)/file.txt
file.txt
con il tuo nome file effettivo.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 -f
comando è quello giusto.
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