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
Utilisez readlink :
readlink -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
ne vérifie pas seul l'existence du fichier. Pour résoudre ce problème, ajoutez l'argument e
: realpath -e file
Ce qui suit fait habituellement le tour:
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
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
find $PWD -type f | grep "filename"
ou
find $PWD -type f -name "*filename*"
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.
"Copy as Path"
realpath yourfile
pour obtenir le chemin complet d'un fichier, comme suggéré par beaucoup.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/ .
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 .
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.
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.
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
Ceci est une explication de ce qui se passe chez @ ZeRemz answer :
"$1"
dirname "$1"
cd "$(dirname "$1")
dans ce répertoire relatif&& pwd -P
et obtenez le chemin absolu pour cela. L'option -P
évitera tous les liens symboliques$(basename "$1")
echo
ilDans 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
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}
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} \'
}
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
Dans mac mentionné ci-dessous des œuvres en ligne. Pas besoin d'ajouter de lignes fantaisistes.
> pwd filename
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