Comment obtenir le chemin complet d'un fichier?


719

Existe-t-il un moyen simple d'imprimer le chemin complet de file.txt?

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

le <command>

dir> <command> file.txt  

devrait imprimer

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

Réponses:


1189

Utilisez readlink :

readlink -f file.txt

32
C'est à ça que sert -f.
cinéaste


5
Juste testé sur 10.9.2, fonctionne très bien. quel readlink / usr / local / opt / coreutils / libexec / gnubin / readlink readlink --version readlink (GNU coreutils) 8.22
J0hnG4lt

10
@ J0hnG4lt: c'est parce que vous avez installé coreutils avec homebrew et changé votre PATH pour pointer vers les binaires non préfixés. Installer coreutils, laisser PATH seul et utiliser "greadlink" fonctionnerait également.
Tim Smith du

35
sur MAC: Installer homebrew puis brew install coreutilspuisgreadlink -f file.txt
Pour Kra

217

Je suppose que vous utilisez Linux.

J'ai trouvé un utilitaire appelé realpathdans coreutils 8.15.

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

Selon les commentaires @ styrofoam-fly et @ arch-standton, realpathseul ne vérifie pas l'existence du fichier, pour résoudre ce problème, ajoutez l' eargument:realpath -e file


Fonctionne avec cygwin (avec mintty 2.7.9)
Scrambo

1
realpatha été engagé pour le repo coreutils fin 2011, la sortie 8.15 a été faite en janvier 2012, j'ai répondu à la question (avec la readlinksuggestion) en mars 2011 :)
filmeur

2
realpath ne vérifie pas l'existence du fichier, il résout simplement les chemins. La demande d'un chemin complet d'un fichier inexistant devrait entraîner une erreur.
mouche en styromousse du

4
@styrofoamfly affiche realpath -eune erreur si l'argument n'existe pas.
Arch Stanton

77

Ce qui suit fait généralement l'affaire:

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

Bonjour. J'ai trouvé cette réponse la mieux adaptée à mes besoins. Pouvez-vous expliquer comment puis-je utiliser une variable locale au lieu du paramètre de ligne de commande (c'est-à-dire $ 1)
deeJ

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

7
@SopalajodeArrierez Parce readlinkque ne fonctionne pas si le fichier est un lien symbolique, il vous montrera la cible du lien symbolique au lieu du lien symbolique lui-même.
qwertzguy

1
J'aime ça, car cela readlinkme ramène au répertoire parent d'où le lien symbolique génère, mais cela l'ignore.
Sukhi

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

35

Je sais qu'il existe un moyen plus simple que cela, mais sacrément si je peux le trouver ...

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"

ou

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

1
Pour moi, sur mac, cela a fonctionné - au lieu de $ pwd -find `pwd` -type file -name \*.dmp
mrwaim

14

Si vous êtes dans le même répertoire que le fichier:

ls "`pwd`/file.txt"

Remplacez file.txtpar votre nom de fichier cible.


9
vous pouvez aussi faireecho $(pwd)/file.txt
Alex

12

Sous Windows:

  • Maintenir Shiftet cliquer avec le bouton droit sur un fichier dans l'Explorateur Windows vous donne une option appelée Copy as Path. Cela copiera le chemin complet du fichier dans le presse-papiers.

Sous Linux:

  • Vous pouvez utiliser la commande realpath yourfilepour obtenir le chemin complet d'un fichier comme suggéré par d'autres.

4

Je sais que c'est une vieille question maintenant, mais juste pour ajouter des informations ici:

La commande Linux whichpeut être utilisée pour trouver le chemin de fichier d'un fichier de commande, c'est-à-dire

$ which ls
/bin/ls

Il y a quelques mises en garde à cela; veuillez consulter https://www.cyberciti.biz/faq/how-do-i-find-the-path-to-a-command-file/ .


5
Cette réponse est trop précise, l'OP ne concerne pas la recherche de commandes.
AL

4

Fonctionne sur Mac, Linux, * nix:

Cela vous donnera un csv cité de tous les fichiers dans le répertoire actuel:

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

La sortie de ceci peut être facilement copiée dans une liste python ou toute autre structure de données similaire.


imprime le chemin de
déplacement

Oui, des virgules complètes séparées par des virgules pour tous les fichiers dans pwd, pour un fichier, faites simplement ls 'filename' au lieu de 'ls'.
Bhargav Srinivasan

3

Vous pouvez utiliser le script fpn (nom de chemin complet) :

% 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

fpnn'est pas un package Linux standard, mais c'est un projet github gratuit et ouvert et vous pouvez le configurer en une minute .


1
En général, pwden soi, il devrait fonctionner correctement sous Linux et la plupart des autres environnements de système d'exploitation de type Unix.
karolus le

3

Vous pouvez utiliser cette fonction. Si le nom du fichier est donné sans chemin relatif, il est supposé être présent dans le répertoire de travail actuel:

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

Usage:

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

Utilisation avec chemin relatif:

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

Avec des espaces dans le nom de fichier:

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

2

Dans un scénario similaire, je lance un script cshell à partir d'un autre emplacement. Pour définir le chemin absolu correct du script afin qu'il s'exécute uniquement dans le répertoire désigné, j'utilise le code suivant:

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

$0 stocke la chaîne exacte de la façon dont le script a été exécuté.

Par exemple , si le script a été lancé comme ceci: $> ../../test/test.csh, $script_dircontiendra/home/abc/sandbox/v1/../../test


voté pour cela car c'est le plus simple et le plus pertinent. Cependant, si vous tapez, ./test.cshvous aurez un chemin se terminant par/test/.
vinyll

2

Pour Mac OS X, j'ai remplacé les utilitaires fournis avec le système d'exploitation et les ai remplacés par une version plus récente de coreutils. Cela vous permet d'accéder à des outils comme readlink -f(pour le chemin absolu vers les fichiers) et realpath(chemin absolu vers les répertoires) sur votre Mac.

La version Homebrew ajoute un «G» (pour les outils GNU) devant le nom de la commande - de sorte que les équivalents deviennent greadlink -f FILEet grealpath DIRECTORY.

Des instructions sur la façon d'installer les outils coreutils / GNU sur Mac OS X via Homebrew peuvent être trouvées dans cet article de StackExchange .

NB: Les commandes readlink -fet realpathdevraient fonctionner hors de la boîte pour les utilisateurs non-Mac Unix.


2
brew install coreutils
À Kra

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

Voici l'explication de ce qui se passe à la réponse de @ ZeRemz :

  1. Ce script obtient le chemin relatif comme argument "$1"
  2. Ensuite, nous obtenons une partie dirname de ce chemin (vous pouvez passer dir ou file à ce script):dirname "$1"
  3. Ensuite, nous cd "$(dirname "$1")dans ce dir relatif
  4. && pwd -Pet obtenir un chemin absolu pour cela. -Pl'option évitera tous les liens symboliques
  5. Après cela, nous ajoutons le nom de base au chemin absolu:$(basename "$1")
  6. Comme étape finale , nous echone

1

Cela a plutôt bien fonctionné pour moi. Il ne repose pas sur le système de fichiers (un pour / contre en fonction des besoins) donc ce sera rapide; et, il devrait être portable sur la plupart des * NIX. Il suppose que la chaîne passée est en effet relative au PWD et non à un autre répertoire.

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

C'est naïf, mais j'ai dû faire en sorte qu'il soit compatible POSIX. Nécessite l'autorisation de cd dans le répertoire du fichier.

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

Habituellement:

find `pwd` | grep <filename>

Alternativement, juste pour le dossier actuel:

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

hm pourquoi la haine?
sjas

0

J'aime beaucoup de réponses déjà données, mais j'ai trouvé cela vraiment utile, en particulier dans un script pour obtenir le chemin complet d'un fichier, y compris les liens symboliques suivants et les références relatives telles que .et..

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

Qui renverra le chemin complet de la à filepartir du chemin racine. Cela peut être utilisé dans un script afin que le script sache à partir de quel chemin il s'exécute, ce qui est utile dans un clone de référentiel qui pourrait être situé n'importe où sur une machine.

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

Je peux ensuite utiliser la ${basePath}variable dans mes scripts pour référencer directement d'autres scripts.

J'espère que cela t'aides,

Dave


0

Vous pouvez l'enregistrer dans votre shell.rcou simplement mettre dans la console

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

exemple:

ap somefile.txt

affichera

/home/user/somefile.txt

3
Mais alors , ce ap ../foobar.txtsera /home/user/../foobar.txtce qui n'est généralement pas ce que vous voulez.
bdesham

2
Aussi ap /tmp/foobar.txtdonnera /home/user//tmp/foobar.txt, ce qui est faux.
David Given

-1
find / -samefile file.txt -print

Trouvera tous les liens vers le fichier avec le même numéro d'inode que file.txt

l'ajout d'un -xdevindicateur évitera findde franchir les limites de l'appareil («points de montage»). (Mais cela ne provoquera probablement rien si le findne démarre pas dans un répertoire sur le même périphérique que file.txt)

Notez que cela findpeut signaler plusieurs chemins pour un seul objet de système de fichiers, car un inode peut être lié par plusieurs entrées de répertoire, éventuellement même en utilisant des noms différents. Par exemple:

find /bin -samefile /bin/gunzip -ls

Sortira:

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

Cela fonctionnera pour le fichier et le dossier:

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


-1

Un autre utilitaire Linux, qui fait ce travail:

fname <file>

-1

Pour Mac OS, si vous voulez simplement obtenir le chemin d'un fichier dans le Finder, cliquez sur le fichier et faites défiler jusqu'à "Services" en bas. Vous disposez de nombreux choix, dont "copier le chemin" et "copier le chemin complet". Cliquer sur l'un d'eux place le chemin dans le presse-papiers.


-1

Dans mac mentionné ci-dessous, la ligne fonctionne. Pas besoin d'ajouter de lignes fantaisie.

> pwd filename

6
Non, il imprime simplement le répertoire de travail (sans le nom du fichier) comme le suggère le nom de la commandeprint working directory
anilbey

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

Copie le texte dans votre presse-papiers et affiche le texte dans la fenêtre du terminal.

:)

(J'ai copié une partie du code d'une autre réponse de dépassement de pile mais je ne trouve plus cette réponse)


-2

le moyen le plus simple que j'ai trouvé est

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

ça marche bien pour moi


-2

Sous Mac OSX, procédez comme suit:

  1. cd dans le répertoire du fichier cible.
  2. Tapez l'une des commandes de terminal suivantes.
Terminal
ls "`pwd`/file.txt"
echo $(pwd)/file.txt
  1. Remplacez file.txtpar votre nom de fichier réel.
  2. presse Enter

-3

A côté de "readlink -f", une autre commande couramment utilisée:

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

Cela donne également le chemin d'accès complet et le nom du fichier sur la console

Hors sujet: cette méthode ne donne que des liens relatifs et non absolus. La readlink -fcommande est la bonne.


-3

Créez une fonction comme ci-dessous (fait écho au chemin absolu d'un fichier avec pwd et ajoute le fichier à la fin du chemin:

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

Vous pouvez maintenant trouver n'importe quel chemin de fichier:

abspath myfile.ext
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.