web-dev-qa-db-fra.com

Comment obtenir le chemin complet d'un fichier?

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
643
Jean

Utilisez readlink :

readlink -f file.txt
1052
filmor

Je suppose que vous utilisez Linux.

J'ai trouvé un utilitaire appelé realpath dans 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, realpath ne vérifie pas seul l'existence du fichier. Pour résoudre ce problème, ajoutez l'argument e: realpath -e file

172
lllllllllllll

Ce qui suit fait habituellement le tour:

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

Je sais Il y a un moyen plus simple de le faire, mais douté 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
29
jcomeau_ictx
find $PWD -type f | grep "filename"

ou

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

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

ls "`pwd`/file.txt"

Remplacez file.txt par votre nom de fichier cible.

11
Steven

Dans Windows, vous pouvez: -

  • Maintenez la touche Maj enfoncée et cliquez avec le bouton droit de la souris sur un fichier, ce qui vous permet d’utiliser l’option "Copy as Path"

    Ceci va copier le chemin complet du fichier dans le presse-papier.

Sous Linux, vous pouvez utiliser la commande: -

  • realpath yourfile pour obtenir le chemin complet d'un fichier, comme suggéré par beaucoup.
10
Natesh bhat

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

La commande Linux which peut être utilisée pour trouver le chemin de fichier d’un fichier de commande, c.-à-d.

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

Vous pouvez utiliser le script fpn (nom du 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

fpn n'est pas un paquet Linux standard, mais c'est n projet github libre et ouvert et vous pouvez le configurer en une minute .

3
Adam Matan

Fonctionne sur Mac, Linux, * nix:

Cela vous donnera un csv cité de tous les fichiers du répertoire en cours:

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

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

3
Bhargav Srinivasan

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

La version Homebrew ajoute un 'G' (pour GNU Tools) devant le nom de la commande - les équivalents deviennent donc greadlink -f FILE et grealpath DIRECTORY.

Des instructions sur la façon d’installer les outils coreutils/GNU sur Mac OS X via Homebrew sont disponibles dans this StackExchange arcticle .

NB: Les commandes readlink -f et realpath devraient fonctionner immédiatement pour les utilisateurs Unix non-Mac.

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

Ceci est une explication de ce qui se passe chez @ ZeRemz answer :

  1. Ce script obtient un chemin relatif en tant qu'argument "$1"
  2. Ensuite nous obtenons dirname une partie de ce chemin (vous pouvez passer soit dir ou fichier à ce script): dirname "$1"
  3. Ensuite, nous cd "$(dirname "$1") dans ce répertoire relatif
  4. && pwd -P et obtenez le chemin absolu pour cela. L'option -P évitera tous les liens symboliques
  5. Après cela, nous ajoutons le nom de base au chemin absolu: $(basename "$1")
  6. En dernière étape, nous echo il
2
Eugen Konkov

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

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

$0 stocke la chaîne exacte de l'exécution du script.

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

2
Ackq

C'est naïf, mais je devais le rendre compatible avec POSIX. Nécessite l'autorisation de se connecter au 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}
1
Andrew Miller

Cela a plutôt bien fonctionné pour moi. Il ne dépend pas du système de fichiers (un avantage/inconvénient selon les besoins), donc ce sera rapide; et, il devrait être portable pour la plupart des * NIX. Cela suppose que la chaîne transmise est bien relative à la 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
Russell Speight

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

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 du fichier:

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

Dans mac mentionné ci-dessous des œuvres en ligne. Pas besoin d'ajouter de lignes fantaisistes.

> pwd filename
0
Sanjeet kumar

Vous pouvez enregistrer ceci dans votre "Shell.rc" ou simplement le mettre en console

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

alias ap = "chemin_absolu"

exemple:

ap somefile.txt

va sortir

/home/user/somefile.txt

0
Roman Rhrn Nesterov