commande bash / fish pour imprimer le chemin absolu vers un fichier

448

Question: existe-t-il une simple commande sh / bash / zsh / fish / ... pour imprimer le chemin absolu du fichier que je l'alimente?

Utilisation cas: Je suis dans le répertoire /a/bet je voudrais imprimer le chemin complet vers le fichier csur la ligne de commande afin que je puisse facilement le coller dans un autre programme: /a/b/c. Simple, mais un petit programme pour le faire pourrait probablement me faire gagner environ 5 secondes lorsqu'il s'agit de gérer de longs chemins, ce qui en fin de compte s'additionne. Cela me surprend donc que je ne trouve pas d'utilitaire standard pour le faire - n'y en a-t-il vraiment pas?

Voici un exemple d'implémentation, abspath.py:

#!/usr/bin/python
# Author: Diggory Hardy <[email protected]>
# Licence: public domain
# Purpose: print the absolute path of all input paths

import sys
import os.path
if len(sys.argv)>1:
    for i in range(1,len(sys.argv)):
        print os.path.abspath( sys.argv[i] )
    sys.exit(0)
else:
    print >> sys.stderr, "Usage: ",sys.argv[0]," PATH."
    sys.exit(1)
dur
la source
Je dirais que la réponse de @ DennisWilliamson (en utilisant l'option -m) est supérieure pour (généralement) être plus portable et travailler avec des fichiers qui n'existent pas.
TTT
Ou la réponse de Flimm; les deux sont de bonnes solutions. Bannier répond cependant le mieux à ma question d'origine.
dhardy
3
Utilisateurs OSX: voir cette réponse
Ian

Réponses:

562

Essayez realpath.

$ realpath example.txt
/home/username/example.txt
Benjamin Bannier
la source
133
+1, très beau programme. Mais notez que c'est une commande externe (pas un shell intégré) et peut ne pas être présent dans tous les systèmes par défaut, c'est-à-dire que vous devrez peut-être l'installer. Dans Debian, il réside dans un paquet séparé portant le même nom.
Roman Cheplyaka du
5
J'ai ajouté à mon chemin un realpathcomposé de: github.com/westonruter/misc-cli-tools/blob/master/realpath
Weston Ruter le
1
@Flimm: Cela vous donnera toujours un chemin valide étant donné un chemin relatif. Si vous voulez connaître l'existence d'un fichier, utilisez un autre outil comme par exemple test.
Benjamin Bannier
14
@Dalin: Essayez d'installer coreutils. Le binaire est nommé grealpath.
Toni Penya-Alba
5
Cet outil a été introduit dans GNU coreutils 8.15 (en 2012), il est donc assez nouveau.
marbu
318

Essayez readlinkqui résoudra les liens symboliques:

readlink -e /foo/bar/baz
En pause jusqu'à nouvel ordre.
la source
50
Je préfère utiliser '-f' au lieu de '-e' afin que nous puissions voir le chemin absolu d'un fichier inexistant.
hluk
5
Cela me semble le plus simple, tout en étant portable. readlink est le port de gnu coreutils, il sera donc installé sur presque toutes les distributions linux, à l'exception de certaines intégrées.
catphive
14
Il me semble que -mc'est la meilleure option à utiliser.
Matt Joiner
1
@Dalin: /usr/bin/readlinksur Mavericks. Ou vouliez-vous dire que ces options ne se trouvent pas sur OS X? Il semble que ce soit une version BSD rabougrie ...: p
iconoclaste
14
@iconoclast Ces options ne sont pas disponibles sur OSX, et selon la readlinkpage de only the target of the symbolic link is printed. If the given argument is not a symbolic link, readlink will print nothing and exit with an errormanuel BSD :, donc readlink ne fonctionnera pas à cet effet sur OSX
SnoringFrog
257
#! /bin/sh
echo "$(cd "$(dirname "$1")"; pwd -P)/$(basename "$1")"
dogbane
la source
8
N'oubliez pas de citer tous les trucs. Si vous ne comprenez pas pourquoi, essayez votre programme sur un fichier a b(deux espaces entre a et b, SO en mange un).
Roman Cheplyaka du
1
essayez également ceci sur "/" il se transforme en "///"
George
35
la seule solution POSIX jusqu'à présent qui ne vous oblige pas à écrire et à compiler un exécutable car readlink et realpath ne sont pas POSIX
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功
25
J'avais l'habitude function realpath { echo $(cd $(dirname $1); pwd)/$(basename $1); }de me faire une realpathcommande (réponse actuellement acceptée) sur OS X. Merci!
James Bedford
1
J'ai utilisé cette méthode pour définir les noms de fichiers journaux pour les scripts:LOG=$(echo $(cd $(dirname $0); pwd)/$(basename $0 .sh).log)
DrStrangepork
84

Oublier readlinket realpathqui peut ou ne peut pas être installé sur votre système.

Développant la réponse de Dogbane ci-dessus, elle est exprimée en fonction:

#!/bin/bash
get_abs_filename() {
  # $1 : relative filename
  echo "$(cd "$(dirname "$1")" && pwd)/$(basename "$1")"
}

vous pouvez ensuite l'utiliser comme ceci:

myabsfile=$(get_abs_filename "../../foo/bar/file.txt")

Comment et pourquoi ça marche?

La solution exploite le fait que la pwdcommande intégrée Bash affichera le chemin absolu du répertoire courant lorsqu'elle sera invoquée sans arguments.

Pourquoi j'aime cette solution?

Il est portable et ne nécessite pas non plus readlinkou realpathqui n'existe souvent pas sur une installation par défaut d'un distro Linux / Unix donné.

Et si dir n'existe pas?

Comme indiqué ci-dessus, la fonction échouera et s'imprimera sur stderr si le chemin de répertoire donné n'existe pas. Ce n'est peut-être pas ce que vous voulez. Vous pouvez développer la fonction pour gérer cette situation:

#!/bin/bash
get_abs_filename() {
  # $1 : relative filename
  if [ -d "$(dirname "$1")" ]; then
    echo "$(cd "$(dirname "$1")" && pwd)/$(basename "$1")"
  fi
}

Maintenant, il retournera une chaîne vide si l'un des répertoires parents n'existe pas.

Comment gérez-vous les «..» ou les «.» en entrée?

Eh bien, cela donne un chemin absolu dans ce cas, mais pas minimal. Cela ressemblera à:

/Users/bob/Documents/..

Si vous voulez résoudre le «..», vous devrez faire le script comme:

get_abs_filename() {
  # $1 : relative filename
  filename=$1
  parentdir=$(dirname "${filename}")

  if [ -d "${filename}" ]; then
      echo "$(cd "${filename}" && pwd)"
  elif [ -d "${parentdir}" ]; then
    echo "$(cd "${parentdir}" && pwd)/$(basename "${filename}")"
  fi
}
peterh
la source
Belle fonction, mais apparemment, vous n'avez pas compris la question. Je voulais quelque chose pour une utilisation interactive, pas des scripts.
dhardy
3
Je voudrais ajouter que cela realpathvient du paquet coreutils, qui contient également des outils tels que who, touchou cat. Il s'agit d'un ensemble d'outils GNU assez standard, vous pouvez donc être sûr qu'il est installé sur presque toutes les machines basées sur Linux.Cela dit, vous avez raison: il y a 2 problèmes avec: i) vous le manquerez probablement dans l'installation par défaut sur systèmes non GNU unix (comme OpenBSD) ii) ces outils ont été introduits dans la version 8.15 (donc c'est assez nouveau, à partir de 2012), donc vous le manquerez sur les systèmes stables à long terme (comme RHEL 6).
marbu
1
Eh bien, il semble au moins que Continuum Analytics (les créateurs de la distribution Anaconda Python ) a aimé cette réponse. Il est implémenté (avec une référence renvoyant ici) dans leur script "activate" , qui est utilisé pour activer les environnements virtuels créés par l'outil conda. Alors… bien!
wjv
1
Cela ne fonctionne que pour les répertoires (puisqu'il n'y en a pas d'autre) et ne peut pas gérer ".." et ".". Voir ma réponse qui devrait tout gérer: stackoverflow.com/a/23002317/2709
Alexander Klimetschek
3
@marbu realpath n'est pas présent sur Ubuntu 14.04, ni sur Debian Wheezy. Cela peut devenir quelque peu standard au fil du temps, mais ce n'est certainement pas maintenant. Notez également que l'OP n'a rien dit sur Linux ou GNU. Bash est plus largement utilisé que cela.
mc0e
76
$ readlink -m FILE
/path/to/FILE

C'est mieux que readlink -e FILEou realpath, car cela fonctionne même si le fichier n'existe pas.

Flimm
la source
Agréable. Cela fonctionne également sur les fichiers / répertoires qui existent mais qui ne sont pas des liens symboliques.
quietmint
J'ai un lien de lecture disponible sur OS X 10.9 (Mavericks), c'est donc certainement la meilleure réponse ici.
Kenneth Hoste
6
@KennethHoste: l' -moption n'est pas disponible sur Mavericks.
iconoclaste du
2
Ce n'est certainement pas sur une installation OSX PAR DÉFAUT.
Fran Marzoa
fonctionne sur linux (CentOS) merci, car realpath n'existait pas pour ça
jimh
65

Ce chemin relatif vers la fonction shell du convertisseur de chemin absolu

  • ne nécessite aucun utilitaire (juste cdet pwd)
  • fonctionne pour les répertoires et les fichiers
  • poignées ..et.
  • gère les espaces en dir ou en noms de fichiers
  • nécessite l'existence d'un fichier ou d'un répertoire
  • ne renvoie rien si rien n'existe sur le chemin donné
  • gère les chemins absolus en entrée (les traverse essentiellement)

Code:

function abspath() {
    # generate absolute path from relative path
    # $1     : relative filename
    # return : absolute path
    if [ -d "$1" ]; then
        # dir
        (cd "$1"; pwd)
    elif [ -f "$1" ]; then
        # file
        if [[ $1 = /* ]]; then
            echo "$1"
        elif [[ $1 == */* ]]; then
            echo "$(cd "${1%/*}"; pwd)/${1##*/}"
        else
            echo "$(pwd)/$1"
        fi
    fi
}

Échantillon:

# assume inside /parent/cur
abspath file.txt        => /parent/cur/file.txt
abspath .               => /parent/cur
abspath ..              => /parent
abspath ../dir/file.txt => /parent/dir/file.txt
abspath ../dir/../dir   => /parent/dir          # anything cd can handle
abspath doesnotexist    =>                      # empty result if file/dir does not exist
abspath /file.txt       => /file.txt            # handle absolute path input

Remarque: Ceci est basé sur les réponses de nolan6000 et bsingh , mais corrige le cas du fichier.

Je comprends également que la question d'origine concernait un utilitaire de ligne de commande existant. Mais comme cela semble être LA question sur stackoverflow pour cela, y compris les scripts shell qui veulent avoir des dépendances minimales, j'ai mis cette solution de script ici, donc je peux la trouver plus tard :)

Alexander Klimetschek
la source
Merci. C'est ce que je fais avec OSX
Greg
Cela ne fonctionne pas pour les répertoires avec des espaces, c'est $ abspath 'a b c/file.txt'-à-dire parce que l'argument to cdn'est pas cité. Pour surmonter cela, au lieu de citer l'intégralité de l'argument echo(y a-t-il une raison à ces citations?), Ne citer que les arguments du chemin. Ie remplacer echo "$(cd ${1%/*}; pwd)/${1##*/}"par echo $(cd "${1%/*}"; pwd)/${1##*/}.
george
@george Merci d'avoir noté, je l'ai corrigé.
Alexander Klimetschek
1
J'ai regardé à travers des dizaines de solutions à moitié armées et cela semble certainement être la solution uniquement bash la plus concise et la plus précise. Vous pouvez l'amincir encore plus en le remplaçant echo "$(cd "$1"; pwd)"par (cd "$1"; pwd). Il n'y a pas besoin d'écho ici.
Six
@Six True, mis à jour. Les accolades ( ... )sont toujours nécessaires, donc cdcela se passe dans un sous-shell, car nous ne voulons pas changer le répertoire de travail pour les appelants de abspath.
Alexander Klimetschek
24

La findcommande peut aider

find $PWD -name ex*
find $PWD -name example.log

Répertorie tous les fichiers dans ou sous le répertoire actuel avec des noms correspondant au modèle. Vous pouvez le simplifier si vous n'obtiendrez que quelques résultats (par exemple un répertoire au bas de l'arborescence contenant peu de fichiers), juste

find $PWD

Je l'utilise sur Solaris 10, qui n'a pas les autres utilitaires mentionnés.

lessthanideal
la source
1
je n'ai pas bloqué ce commentaire lors de la première lecture; le point clé ici est que si vous donnez un chemin absolu à la commande find, elle produira des résultats en chemin absolu. donc utiliser $ PWD est le chemin absolu de l'endroit où vous vous trouvez afin d'obtenir la sortie en absolu.
simbo1905
4
Si vous comptez PWD, vous pouvez simplement utiliser $PWD/$filename.
jonny
Cette approche peut être améliorée en utilisant -maxdepth 1. N'oubliez pas non plus de citer - les problèmes de sécurité potentiels ici, selon la façon dont vous l'utilisez.
mc0e
1
@jonny: $ PWD / $ filename échoue si $ filename est déjà absolu.
mc0e
Cela échoue si le nom de fichier est donné sous la forme "./nomfichier.txt" (avec point et barre oblique).
Mark Stosberg
15

Si vous n'avez pas d'utilitaires readlink ou realpath, vous pouvez utiliser la fonction suivante qui fonctionne en bash et zsh (pas sûr du reste).

abspath () { case "$1" in /*)printf "%s\n" "$1";; *)printf "%s\n" "$PWD/$1";; esac; }

Cela fonctionne également pour les fichiers inexistants (tout comme la fonction python os.path.abspath ).

Malheureusement, abspath ./../somefilene se débarrasse pas des points.

hluk
la source
1
Ça me semble portable. Par contre, se cassera par exemple sur un nom de fichier contenant une nouvelle ligne.
Roman Cheplyaka du
1
Pour améliorer davantage, remplacez echo "$1"par printf "%s\n" "$1"(idem avec le deuxième écho). echopeut interpréter des barres obliques inverses à l'intérieur de ses arguments.
Roman Cheplyaka du
Encore une fois, vous avez raison! Vraiment, le comportement de la commande echo dans zsh est différent de bash.
hluk
1
Strictement parlant, sous POSIX, le comportement de l'écho n'est pas défini si les arguments contiennent des barres obliques inverses. Cependant, il est défini sous l'extension XSI (à savoir, l'écho doit interpréter les séquences d'échappement). Mais bash et zsh sont tellement loin même de la conformité POSIX ...
Roman Cheplyaka
Désolé, mais je ne vois pas le point. J'ai déjà fourni une réponse sous forme de script avec plus de fonctionnalités que cela et il n'a pas besoin d'être utilisé dans un script shell.
dhardy
10

Voici une fonction uniquement zsh que j'aime pour sa compacité. Il utilise le modificateur d'expansion 'A' - voir zshexpn (1).

realpath() { for f in "$@"; do echo ${f}(:A); done }
wjv
la source
Wow, c'est une solution élégante !!
ShellFish
6

Il n'y a généralement pas une telle chose que l' absolute path un fichier (ce moyen de déclaration qu'il peut y avoir plus d'un général, d' où l'utilisation de l'article défini l' est pas approprié). An absolute pathest un chemin qui part de la racine "/" et désigne un fichier sans ambiguïté indépendamment du répertoire de travail (voir par exemple wikipedia ).

A relative pathest un chemin qui doit être interprété à partir d'un autre répertoire. Il peut s'agir du répertoire de travail s'il s'agit d'un relative pathêtre manipulé par une application (mais pas nécessairement). Lorsqu'il se trouve dans un lien symbolique dans un répertoire, il est généralement destiné à être relatif à ce répertoire (bien que l'utilisateur puisse avoir d'autres utilisations en tête).

Par conséquent, un chemin absolu n'est qu'un chemin relatif au répertoire racine.

Un chemin (absolu ou relatif) peut contenir ou non des liens symboliques. Si ce n'est pas le cas, il est également quelque peu imperméable aux changements dans la structure de liaison, mais ce n'est pas nécessairement requis ni même souhaitable. Certaines personnes appellent canonical path(ou canonical file nameou resolved path) un absolute pathdans lequel tous les liens symboliques ont été résolus, c'est-à-dire qu'ils ont été remplacés par un chemin vers tout ce vers quoi ils se connectent. Les commandes realpathet les readlinkdeux recherchent un chemin canonique, mais n'ont realpathqu'une option pour obtenir un chemin absolu sans se soucier de résoudre les liens symboliques (ainsi que plusieurs autres options pour obtenir différents types de chemins, absolus ou relatifs à certains répertoires).

Cela appelle plusieurs remarques:

  1. les liens symboliques ne peuvent être résolus que si tout ce qu'ils sont censés lier est déjà créé, ce qui n'est évidemment pas toujours le cas. Les commandes realpathet readlinkont des options pour en tenir compte.
  2. un répertoire sur un chemin peut plus tard devenir un lien symbolique, ce qui signifie que le chemin n'est plus canonical. Par conséquent, le concept dépend du temps (ou de l'environnement).
  3. même dans le cas idéal, lorsque tous les liens symboliques peuvent être résolus, il peut y en avoir plus d'un canonical pathvers un fichier, pour deux raisons:
    • la partition contenant le fichier peut avoir été montée simultanément ( ro) sur plusieurs points de montage.
    • il peut y avoir des liens durs vers le fichier, ce qui signifie essentiellement que le fichier existe dans plusieurs répertoires différents.

Par conséquent, même avec la définition beaucoup plus restrictive de canonical path, il peut y avoir plusieurs chemins canoniques vers un fichier. Cela signifie également que le qualificatif canonicalest quelque peu inadéquat car il implique généralement une notion d'unicité.

Cela développe une brève discussion du sujet dans une réponse à une autre question similaire à Bash: récupérer le chemin absolu étant donné relatif

Ma conclusion est que realpathc'est mieux conçu et beaucoup plus flexible que readlink. La seule utilisation de readlinkcela n'est pas couverte par realpathl'appel sans option renvoyant la valeur d'un lien symbolique.

babou
la source
Cela ne me dérange pas d'être rétrogradé, mais j'aime comprendre pourquoi afin que je puisse apprendre quelque chose, technique ou concernant ce qui est considéré comme une bonne pratique sur le site. Eh bien ... au moins, cela m'a incité à m'inscrire à Meta Stack Overflow pour mieux comprendre la sociologie locale. Je le recommande. - Pourtant, si quelqu'un a une opinion sur le caractère inapproprié de ma réponse, je suis intéressé.
babou
1
(a) la question a une réponse valide d'il y a 2 ans et demi, (b) il y a un (unique) chemin absolu correspondant à un chemin relatif (ce que je voulais), mais peut-être pas à un fichier comme vous souligné. BTW tous les commentaires sur realpathvs readlinkou même sur les liens symboliques sont excédentaires à ce que j'ai demandé.
dhardy
1
Deuxième commentaire: les réponses courtes sont très souvent plus utiles que les longues conférences. Le débordement de pile est généralement utilisé pour poser des questions spécifiques.
dhardy
5
1- Le fait qu'une question ait une réponse valable depuis si longtemps ne signifie pas qu'elle est close. Les questions ne sont pas destinées à un usage personnel uniquement. En effet, il existe des badges pour les réponses qui recueillent plus de votes que la réponse validée. Et avec de nouveaux outils, la «meilleure» réponse peut changer avec le temps. De nombreuses personnes utilisent d'anciennes réponses accessibles via la recherche sur le Web.
babou
1
2 - Vous insistez sur le fait qu'il existe un (unique) chemin absolu correspondant à un chemin relatif . Bien que je devine ce que vous entendez par "correspondant", c'est-à-dire un chemin dérivé de l'original à travers un ensemble donné de transformations, votre déclaration est toujours incorrecte. Il existe un chemin canonique "correspondant" unique. Le mot canonicalfait précisément référence à cette unicité par rapport à un ensemble de transformations. Mais, par exemple, / dev / cdrom est un chemin absolu parfaitement bon, même s'il s'agit en fait d'un lien vers / dev / sr0. Les deux pointent vers le même appareil. Ma réponse originale indiquait un article Web pertinent.
babou
5

La dogbane réponse avec la description de ce qui se passe:

#! /bin/sh
echo "$(cd "$(dirname "$1")"; pwd)/$(basename "$1")"

Explication:

  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 entrons cd "$(dirname "$1")dans ce répertoire relatif et obtenons le chemin absolu pour celui-ci en exécutant la pwdcommande shell
  4. Après cela, nous ajoutons le nom de base au chemin absolu:$(basename "$1")
  5. Comme étape finale , nous echone
Eugen Konkov
la source
2

Pour les répertoires dirnameest déclenché ../et retourne ./.

La fonction de nolan6000 peut être modifiée pour corriger cela:

get_abs_filename() {
  # $1 : relative filename
  if [ -d "${1%/*}" ]; then
    echo "$(cd ${1%/*}; pwd)/${1##*/}"
  fi
}
bsingh
la source
1
Bienvenue chez SO! Pour les petits changements et remarques, l'ajout d'un commentaire à une réponse existante peut être plus approprié que l'ajout d'une réponse, surtout si cette réponse copiée manque de beaucoup d'autres informations de la réponse d'origine. Une fois que vous avez collecté un peu plus de réputation, vous pouvez ajouter des commentaires aux réponses des autres. Pour l'instant, essayez de gagner de la réputation en posant des questions uniques et précieuses ou en fournissant de bonnes réponses autonomes.
cfi
1
Puisque vous faites référence à la réponse de nolan6000, veuillez noter que l'affiche dhardy a déjà indiqué qu'il n'accepterait pas la réponse de nolan6000 parce qu'il ne cherche pas de script. Donc à proprement parler, votre réponse ne répond pas à la question.
cfi
la fonction peut être ajoutée .profileet donc disponible pour une utilisation interactive.
adib
Cela ne fonctionnera pas si $1c'est un nom de fichier simple: get_abs_filename foo-> rien (ou <current_dir>/foo/foosi fooc'est un répertoire).
ivan_pozdeev
2

Ce n'est pas une réponse à la question, mais pour ceux qui font du script:

echo `cd "$1" 2>/dev/null&&pwd||(cd "$(dirname "$1")";pwd|sed "s|/*\$|/${1##*/}|")`

il gère / .. ./ etc correctement. Je semble aussi travailler sur OSX

Alek
la source
2

J'ai placé le script suivant sur mon système et je l'appelle comme un alias bash lorsque je veux saisir rapidement le chemin d'accès complet à un fichier dans le répertoire actuel:

#!/bin/bash
/usr/bin/find "$PWD" -maxdepth 1 -mindepth 1 -name "$1"

Je ne sais pas pourquoi, mais sous OS X quand il est appelé par un script "$ PWD" se développe sur le chemin absolu. Lorsque la commande find est appelée sur la ligne de commande, elle ne le fait pas. Mais il fait ce que je veux ... profiter.

fred.johnsen
la source
$PWDa toujours le chemin absolu du répertoire de travail. De plus, findne tolérera pas les barres obliques, vous ne répondez donc pas à la question comme demandé. Une façon plus rapide de faire ce que vous cherchez à faire serait tout simplementecho "$PWD/$1"
Adam Katz
2

Le plus simple si vous souhaitez utiliser uniquement des builtins est probablement:

find `pwd` -name fileName

Seulement deux mots supplémentaires à taper, et cela fonctionnera sur tous les systèmes Unix, ainsi que OSX.

Arj
la source
J'ajouterais -maxdepth 1avant -name(en supposant que le fichier se trouve dans le répertoire courant). Sans cela, il fonctionnera avec des fichiers dans n'importe quel sous-répertoire de pwd, mais pas avec d'autres.
Walter Tross
En effet vous avez raison, la question précisait que le fichier se trouverait dans le répertoire courant. Que voulez-vous dire "mais pas avec les autres"?
Arj
Je ne veux findpas trouver un fichier en dehors de l'arborescence de répertoires en dessous pwd. Par exemple, si vous essayez find . -name ../existingFile, cela échoue.
Walter Tross
Assez juste, oui, cela supposerait que vous vouliez imprimer le chemin complet d'un fichier dans votre cwd (selon la question d'origine), ou n'importe où dans votre arbre cwd (pas dans la question d'origine).
Arj
1
#! /bin/bash

file="$@"
realpath "$file" 2>/dev/null || eval realpath $(echo $file | sed 's/ /\\ /g')

Cela compense les lacunes de realpath, stockez-le dans un script shell fullpath. Vous pouvez maintenant appeler:

$ cd && touch a\ a && rm A 2>/dev/null 
$ fullpath "a a"
/home/user/a a
$ fullpath ~/a\ a
/home/user/a a
$ fullpath A
A: No such file or directory.
Fruits de mer
la source
Qu'est-ce que ça résout? realpath "foo bar"-> /home/myname/foo bar. Si vous ne pouvez pas prendre la peine de citer des arguments de ligne de commande, ce n'est pas realpathla faute.
ivan_pozdeev
D'accord, c'est plus un emballage pratique.
ShellFish
1

Une alternative pour obtenir le chemin absolu en Ruby :

realpath() {ruby -e "require 'Pathname'; puts Pathname.new('$1').realpath.to_s";}

Fonctionne sans arguments (dossier actuel) et chemin de fichier ou de dossier relatif et absolu comme agument.

Atika
la source
0

Répondre avec Homebrew

realpathest la meilleure réponse, mais si vous ne l'avez pas installé, vous devez d'abord exécuter brew install coreutilsce qui installera coreutils avec beaucoup de fonctions impressionnantes. Écrire une fonction personnalisée et l'exporter est trop de travail et risque d'erreur pour quelque chose comme ça, voici deux lignes:

$ brew install coreutils
$ realpath your-file-name.json 
Zorayr
la source
-1

Hé les gars, je sais que c'est un vieux fil de discussion, mais je poste juste ceci pour référence à toute autre personne qui a visité ce site comme moi. Si j'ai bien compris la question, je pense que la locate $filenamecommande. Il affiche le chemin absolu du fichier fourni, mais uniquement s'il existe.

glacial
la source
4
locateest un utilitaire pour rechercher des fichiers / chemins par leur nom. Il peut faire le travail mais peut également trouver d'autres correspondances et ne pas trouver un fichier existant sans appeler en updatedbtant que root en premier.
dhardy