it-swarm.com.de

Kann ich mit einem Bash-Skript eine lokale Datei in $ 1 einfügen und den absoluten Pfad der Datei wiedergeben lassen?

Ziemlich selbsterklärend.

Das erste Argument sollte sein:

  • Überprüft, ob die Datei existiert
  • Geben Sie den absoluten Pfad dieser Datei wieder

Zum Beispiel:

[email protected]:~$ ./myscript myfile.txt
/home/akiva/myfile.txt

Vielen Dank

9
Akiva

Wenn Ihr Skript ist

#!/bin/bash
[[ -e "$1" ]] && readlink -f -- "$1"

Und hat Ausführungsberechtigung (chmod u+x scriptname) Sie können eingeben

./scriptname file

Um den vollständigen Pfad zu erhalten, wenn die Datei vorhanden ist (obwohl Serg hat Recht dass der Test redundant ist, wenn wir readlink -e und George hat Recht verwenden realpath statt readlink)

Anmerkungen

  • [[ -e "$1" ]] Test, ob $1, das erste Argument für das Skript, vorhanden ist
  • && Wenn dies der Fall ist (wenn der vorherige Befehl erfolgreich war), führen Sie den nächsten Befehl aus
  • readlink -f -- "$1" druckt den vollständigen Pfad (zur realen Datei, auch wenn $1 ein Symlink ist)

OP angeforderte Sonderzeichen werden mit Escapezeichen gedruckt. Es muss einen intelligenten Weg geben *, aber ich habe es so gemacht (obwohl es nicht mit einfachen Anführungszeichen zu tun hat - aber diese können trotzdem nicht ausgeblendet werden)

[[ -e "$1" ]] && readlink -f -- "$1" | sed -r 's/\||\[|\]| |!|"|\$|%|\^|&|\*|\(|\)\{|\}|\#|@|\;|\?|<|>/\\&/g'

Wenn es nur Räume sind, um die Sie sich Sorgen machen, könnten Sie das schaffen

sed 's/ /\\ /g'

Dies würde einfache Anführungszeichen (nicht sehr nützlich) und Leerzeichen erhalten

sed -r "s/'| /\\\&/g"

Aber ich glaube nicht, dass man sowohl einfache als auch doppelte Anführungszeichen fangen kann ...

* Hier ist der clevere Weg, 100% Kredit an Stahlfahrer

[[ -e "$1" ]] && printf "%q\n" "$(readlink -f -- "$1")"
7
Zanna

Skript ist nicht erforderlich. Ein einziger readlink Befehl ist ausreichend:

$ cd /etc/

$ readlink -e passwd
/etc/passwd

Aus dem 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"

Aktualisieren Sie, um nicht-alphanumerische Zeichen zu berücksichtigen:

#!/bin/bash

[[ -e "$1" ]] && echo "$1" | sed -r 's/[^a-zA-Z0-9\-]/\//g' | realpath -e "$1"

Bereiten Sie das Skript vor: chmod +x script_name, dann

benutze es: ./script_name filename

Information:

  1. [[ -e "$1" ]]: Überprüfen Sie, ob die übergebene Datei existiert.
7
George Udosen