Réponses:
Utilisez readlink :
readlink -f file.txt
brew install coreutils
puisgreadlink -f file.txt
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
seul ne vérifie pas l'existence du fichier, pour résoudre ce problème, ajoutez l' e
argument:realpath -e file
realpath
a é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 readlink
suggestion) en mars 2011 :)
realpath -e
une erreur si l'argument n'existe pas.
Ce qui suit fait généralement l'affaire:
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
LOCAL_VARIABLE="filename.txt" && echo $(cd $(dirname "$LOCAL_VARIABLE") && pwd -P)/$(basename "$LOCAL_VARIABLE")
readlink
que 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.
readlink
me ramène au répertoire parent d'où le lien symbolique génère, mais cela l'ignore.
set .. && echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
### Sortie: / home / ravi / ..
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
find $PWD -type f | grep "filename"
ou
find $PWD -type f -name "*filename*"
find `pwd` -type file -name \*.dmp
Shift
et 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.realpath yourfile
pour obtenir le chemin complet d'un fichier comme suggéré par d'autres.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'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/ .
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.
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
fpn
n'est pas un package Linux standard, mais c'est un projet github gratuit et ouvert et vous pouvez le configurer en une minute .
pwd
en soi, il devrait fonctionner correctement sous Linux et la plupart des autres environnements de système d'exploitation de type Unix.
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
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_dir
contiendra/home/abc/sandbox/v1/../../test
./test.csh
vous aurez un chemin se terminant par/test/.
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 FILE
et 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 -f
et realpath
devraient fonctionner hors de la boîte pour les utilisateurs non-Mac Unix.
brew install coreutils
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
Voici l'explication de ce qui se passe à la réponse de @ ZeRemz :
"$1"
dirname "$1"
cd "$(dirname "$1")
dans ce dir relatif&& pwd -P
et obtenir un chemin absolu pour cela. -P
l'option évitera tous les liens symboliques$(basename "$1")
echo
neCela 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} \'
}
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}
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 à file
partir 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
Vous pouvez l'enregistrer dans votre shell.rc
ou simplement mettre dans la console
function absolute_path { echo "$PWD/$1"; }
alias ap="absolute_path"
exemple:
ap somefile.txt
affichera
/home/user/somefile.txt
ap ../foobar.txt
sera /home/user/../foobar.txt
ce qui n'est généralement pas ce que vous voulez.
ap /tmp/foobar.txt
donnera /home/user//tmp/foobar.txt
, ce qui est faux.
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 -xdev
indicateur évitera find
de franchir les limites de l'appareil («points de montage»). (Mais cela ne provoquera probablement rien si le find
ne démarre pas dans un répertoire sur le même périphérique que file.txt
)
Notez que cela find
peut 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
Cela fonctionne avec Linux et Mac OSX.
echo $(pwd)$/$(ls file.txt)
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.
Dans mac mentionné ci-dessous, la ligne fonctionne. Pas besoin d'ajouter de lignes fantaisie.
> pwd filename
print working directory
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)
Sous Mac OSX, procédez comme suit:
cd
dans le répertoire du fichier cible.ls "`pwd`/file.txt"
echo $(pwd)/file.txt
file.txt
par votre nom de fichier réel.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 -f
commande est la bonne.
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