Assez explicite.
Le premier argument devrait être:
Par exemple:
+akiva@akiva-ThinkPad-X230:~$ ./myscript myfile.txt
/home/akiva/myfile.txt
Merci
Si votre script est
#!/bin/bash
[[ -e "$1" ]] && readlink -f -- "$1"
Et a l'autorisation d'exécuter (chmod u+x scriptname
) Vous pouvez entrer
./scriptname file
Pour obtenir le chemin complet si le fichier existe (bien que Serg a raison que le test soit redondant si nous utilisons readlink -e
et George a raison utiliser realpath
plutôt que readlink
)
[[ -e "$1" ]]
vérifier si $1
, le premier argument du script, existe&&
si c'est le cas (si la commande précédente a abouti), exécutez la commande suivantereadlink -f -- "$1"
affiche le chemin complet (vers le fichier réel, même si $1
est un lien symbolique)OP a demandé que les caractères spéciaux soient imprimés avec des échappements. Il doit y avoir un moyen intelligent * mais je l’ai fait comme ça (bien que cela ne traite pas des guillemets simples - mais ceux-ci ne peuvent pas être échappés de toute façon)
[[ -e "$1" ]] && readlink -f -- "$1" | sed -r 's/\||\[|\]| |!|"|\$|%|\^|&|\*|\(|\)\{|\}|\#|@|\;|\?|<|>/\\&/g'
Si ce ne sont que des espaces qui vous inquiètent, vous pouvez le faire
sed 's/ /\\ /g'
Cela donnerait des guillemets simples (pas très utiles) et des espaces
sed -r "s/'| /\\\&/g"
Mais je ne pense pas que vous puissiez intercepter les guillemets simples et les guillemets doubles ...
* Voici la manière intelligente, crédit à 100% à steeldriver
[[ -e "$1" ]] && printf "%q\n" "$(readlink -f -- "$1")"
Le script n'est pas nécessaire. Une seule commande readlink
suffit
$ cd /etc/
$ readlink -e passwd
/etc/passwd
Du man readlink
:
-e, --canonicalize-existing
canonicalize by following every symlink in every component
of the given name recursively, all components must exist
#!/bin/bash
[[ -e "$1" ]] && echo realpath -e "$1"
Mise à jour pour prendre en charge les caractères non alphanumériques:
#!/bin/bash
[[ -e "$1" ]] && echo "$1" | sed -r 's/[^a-zA-Z0-9\-]/\//g' | realpath -e "$1"
Préparer le script: chmod +x script_name
, puis
utilisez-le: ./script_name filename
Information:
[[ -e "$1" ]]
: vérifie si le fichier transmis existe .