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.
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
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.
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)
@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 ...
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.
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'.
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; }
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.
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} \'
}
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 à 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.
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:
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.
brew install coreutils
puisgreadlink -f file.txt
Je suppose que vous utilisez Linux.
J'ai trouvé un utilitaire appelé
realpath
dans coreutils 8.15.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
la source
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 lareadlink
suggestion) en mars 2011 :)realpath -e
une erreur si l'argument n'existe pas.Ce qui suit fait généralement l'affaire:
la source
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 ...
la source
ou
la source
find `pwd` -type file -name \*.dmp
Si vous êtes dans le même répertoire que le fichier:
Remplacez
file.txt
par votre nom de fichier cible.la source
echo $(pwd)/file.txt
Sous Windows:
Shift
et cliquer avec le bouton droit sur un fichier dans l'Explorateur Windows vous donne une option appeléeCopy as Path
. Cela copiera le chemin complet du fichier dans le presse-papiers.Sous Linux:
realpath yourfile
pour obtenir le chemin complet d'un fichier comme suggéré par d'autres.la source
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-à-direIl y a quelques mises en garde à cela; veuillez consulter https://www.cyberciti.biz/faq/how-do-i-find-the-path-to-a-command-file/ .
la source
Fonctionne sur Mac, Linux, * nix:
Cela vous donnera un csv cité de tous les fichiers dans le répertoire actuel:
La sortie de ceci peut être facilement copiée dans une liste python ou toute autre structure de données similaire.
la source
Vous pouvez utiliser le script fpn (nom de chemin complet) :
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 .la source
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:
Usage:
Utilisation avec chemin relatif:
Avec des espaces dans le nom de fichier:
la source
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:
$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
la source
./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) etrealpath
(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
etgrealpath 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
etrealpath
devraient fonctionner hors de la boîte pour les utilisateurs non-Mac Unix.la source
brew install coreutils
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
nela source
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.
la source
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.
la source
Habituellement:
Alternativement, juste pour le dossier actuel:
la source
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..
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.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
la source
Vous pouvez l'enregistrer dans votre
shell.rc
ou simplement mettre dans la consoleexemple:
affichera
la source
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.Trouvera tous les liens vers le fichier avec le même numéro d'inode que file.txt
l'ajout d'un
-xdev
indicateur éviterafind
de franchir les limites de l'appareil («points de montage»). (Mais cela ne provoquera probablement rien si lefind
ne démarre pas dans un répertoire sur le même périphérique quefile.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:Sortira:
la source
Cela fonctionnera pour le fichier et le dossier:
la source
Cela fonctionne avec Linux et Mac OSX.
la source
Un autre utilitaire Linux, qui fait ce travail:
la source
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.
la source
Dans mac mentionné ci-dessous, la ligne fonctionne. Pas besoin d'ajouter de lignes fantaisie.
la source
print working directory
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)
la source
le moyen le plus simple que j'ai trouvé est
ça marche bien pour moi
la source
Sous Mac OSX, procédez comme suit:
cd
dans le répertoire du fichier cible.file.txt
par votre nom de fichier réel.la source
A côté de "readlink -f", une autre commande couramment utilisée:
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.la source
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:
Vous pouvez maintenant trouver n'importe quel chemin de fichier:
la source