it-swarm-eu.dev

Come ottenere il percorso completo di un file?

C'è un modo semplice per stampare il percorso completo di 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
607
Jean

Usa readlink :

readlink -f file.txt
985
filmor

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

Come per i commenti @ styrofoam-fly e @ Arch-standton, solo realpath non verifica la presenza di file, per risolvere questo problema aggiungere l'argomento e: realpath -e file

157
lllllllllllll

Il seguente di solito fa il trucco:

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

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

[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"

o

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

Se ti trovi nella stessa directory del file:

ls "`pwd`/file.txt"

Sostituisci file.txt con il tuo nome file di destinazione.

11
Steven

In Windows puoi: -

  • Tieni premuto Maiusc e fai clic con il pulsante destro del mouse su un file che ti offre l'opzione chiamata "Copy as Path"

    Copierà il percorso completo del file negli appunti.

In Linux puoi usare il comando: -

  • realpath yourfile per ottenere il percorso completo di un file come suggerito da molti.
9
Natesh bhat

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

Il comando Linux which può essere utilizzato per trovare il percorso file di un file di comando, ad es.

$ which ls
/bin/ls

Ci sono alcuni avvertimenti a questo; per favore vedi https://www.cyberciti.biz/faq/how-do-i-find-the-path-to-a-command-file/ .

5
Lord Cat

Puoi usare fpn (nome completo del percorso) script:

% 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 standard di Linux, ma è un progetto github libero e aperto e tu potresti configurarlo in un minuto .

3
Adam Matan

Funziona su Mac, Linux, * nix:

Questo ti darà un csv quotato 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 qualsiasi struttura di dati simile.

3

Per Mac OS X, ho sostituito le utilità fornite con il sistema operativo e le ho sostituite con una versione più recente di coreutils. Questo ti consente di accedere a strumenti come readlink -f (per il percorso assoluto ai file) e realpath (percorso assoluto alle directory) sul tuo Mac.

La versione Homebrew aggiunge una "G" (per GNU Strumenti) davanti al nome del comando - così gli equivalenti diventano greadlink -f FILE e grealpath DIRECTORY.

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

NB: I comandi readlink -f e realpath dovrebbero funzionare fuori dagli schemi per utenti Unix non Mac.

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

Questa è la spiegazione di cosa sta succedendo a @ ZeRemz's answer :

  1. Questo script ottiene il percorso relativo come argomento "$1"
  2. Quindi otteniamo dirname parte di quel percorso (puoi passare una directory o un file a questo script): dirname "$1"
  3. Quindi cd "$(dirname "$1") in questa dir relativa
  4. && pwd -P e ottieni il percorso assoluto per questo. L'opzione -P eviterà tutti i collegamenti simbolici
  5. Dopo di ciò aggiungiamo basename al percorso assoluto: $(basename "$1")
  6. Come passo finale abbiamo echo it
2
Eugen Konkov

In uno scenario simile, sto lanciando uno script cshell da un'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 su come è stato eseguito lo script.

Ad es. se lo script è stato lanciato in questo modo: $> ../../test/test.csh, $script_dir conterrà /home/abc/sandbox/v1/../../test

2
Ackq

Questo è ingenuo, ma dovevo renderlo compatibile con POSIX. Richiede l'autorizzazione per effettuare 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}
1
Andrew Miller

Puoi salvarlo nel tuo "Shell.rc" o semplicemente metterlo in console

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

alias ap = "absolute_path"

esempio:

ap somefile.txt

uscirà

/home/user/somefile.txt

1

Questo ha funzionato abbastanza bene per me. Non si basa sul file system (un pro/con a seconda delle necessità) quindi sarà veloce; e, dovrebbe essere portatile per quasi tutti i * NIX. Presume che la stringa passata sia effettivamente relativa al PWD e non ad altre 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
Russell Speight

Puoi usare 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 gli spazi nel nome del file:

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

In mac menzionato sotto funziona la linea. Non è necessario aggiungere linee di fantasia.

> pwd filename
0
Sanjeet kumar