web-dev-qa-db-fra.com

Puis-je alimenter un fichier local par un script bash dans $ 1 et le faire rappeler le chemin absolu du fichier?

Assez explicite.

Le premier argument devrait être:

  • Vérifié si le fichier existe
  • Écho du chemin absolu de ce fichier

Par exemple:

+akiva@akiva-ThinkPad-X230:~$ ./myscript myfile.txt
/home/akiva/myfile.txt

Merci

9
Akiva

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)

Remarques

  • [[ -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 suivante
  • readlink -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")"
7
Zanna

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
8
#!/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:

  1. [[ -e "$1" ]]: vérifie si le fichier transmis existe .
7
George Udosen