Acrobase  

Καλώς ήρθατε στην AcroBase.
Δείτε εδώ τα πιο πρόσφατα μηνύματα από όλες τις περιοχές συζητήσεων, καθώς και όλες τις υπηρεσίες της AcroBase.
H εγγραφή σας είναι γρήγορη και εύκολη.

Επιστροφή   Acrobase > Υπολογιστές και Τεχνολογία > Πληροφορική και Επικοινωνία > Linux
Ομάδες (Groups) Τοίχος Άρθρα acrobase.org Ημερολόγιο Φωτογραφίες Στατιστικά

Notices

Δεν έχετε δημιουργήσει όνομα χρήστη στην Acrobase.
Μπορείτε να το δημιουργήσετε εδώ

Απάντηση στο θέμα
 
Εργαλεία Θεμάτων Τρόποι εμφάνισης
  #1  
Παλιά 06-03-11, 17:14
Το avatar του χρήστη Archmage
Archmage Ο χρήστης Archmage δεν είναι συνδεδεμένος
Μέλος
 

Τελευταία φορά Online: 14-03-18 00:30
Φύλο: Άντρας
Μετατροπή URI σε filename

Εισαγωγή (που δε χρειάζεται να διαβάσετε): Στο file manager Nautilus υπάρχει η δυνατότητα να ορίσει ο χρήστης δικά του scripts (executables κλπ) για αρχεία/φακέλους στα οποία πατάει δεξί κουμπί, τα οποία scripts μετά φαίνονται σε ειδικό υπομενού ("scripts").

Όταν το αρχείο είναι local, το σύστημα περνά στο script τις παραμέτρους ως $0, $1 κλπ. Μπορώ να βρώ αν χρειάζεται το target directory με το pwd, οπότε τελικά η πλήρης διαδρομή του αρχείου που με ενδιαφέρει είναι η "`pwd`$1".

Το πρόβλημα είναι ότι αυτό δε δουλεύει σε απομακρυσμένα αρχεία, πχ σε samba share. Εκ κατασκευής το nautilus δεν περνά καθόλου τις $0, $1 κλπ σε αυτή την περίπτωση. Αυτά που περνά (*) είναι τα:

NAUTILUS_SCRIPT_SELECTED_URIS: URIs delimited by \n (**)

NAUTILUS_SCRIPT_CURRENT_URI: Current URI

Οπότε, τελικά, αν έχω "το αρχείο μου" στο share και πατήσω δεξί κουμπί, μου γυρίζει κάτι σαν (***):

NAUTILUS_SCRIPT_SELECTED_URIS = smb://myServer/myShare/my%20folder/%CF%84%CE%BF%20%CE%B1%CF%81%CF%87%CE%B5%CE%AF%CE%B F%20%CE%BC%CE%BF%CF%85

NAUTILUS_SCRIPT_CURRENT_URI = smb://myServer/myShare/my%20folder



Το ερώτημα είναι: Πώς θα μετατρέψω αυτό το URI:

NAUTILUS_SCRIPT_SELECTED_URIS = smb://myServer/myShare/my%20folder/%CF%84%CE%BF%20%CE%B1%CF%81%CF%87%CE%B5%CE%AF%CE%B F%20%CE%BC%CE%BF%CF%85

στο "ανθρώπινο" filename:

"//myServer/myShare/my\ folder/το\ αρχείο μου"

(με ή χωρίς τα \ που απλώς κάνουν escape τα κενά)

Υπάρχει ο "χαζός" τρόπος να φτιάξω με το χέρι την αντιστοιχία από όλα τα %xx σε κανονικούς χαρακτήρες, πχ το:

properName=`echo "${NAUTILUS_SCRIPT_SELECTED_URIS}" | sed 's/%20/ /g'`

θα μετατρέψει όλα τα %20 σε κενά.

Υπάρχει κάτι έτοιμο που να το κάνει για όλα τα %xx;



(*) τις δίνει και για local αρχεία, απλά δε χρειάζονται
(**) ας θεωρήσουμε ότι περνάμε μόνο ένα, άρα η μεταβλητή θα έχει ακριβώς ένα 0x0A, στο τέλος
(***) επίσης περνά και μια μεταβλητή από την οποία καταλαβαίνουμε ότι το αρχείο είναι remote, αλλά δε μας απασχολεί εδώ
__________________
may you live in interesting times
Απάντηση με παράθεση
  #2  
Παλιά 06-03-11, 17:54
Qluser Ο χρήστης Qluser δεν είναι συνδεδεμένος
Μέλος
 

Τελευταία φορά Online: 24-02-23 19:01
Αρχική Δημοσίευση από Archmage Εμφάνιση μηνυμάτων
Υπάρχει ο "χαζός" τρόπος να φτιάξω με το χέρι την αντιστοιχία από όλα τα %xx σε κανονικούς χαρακτήρες, πχ το:

properName=`echo "${NAUTILUS_SCRIPT_SELECTED_URIS}" | sed 's/%20/ /g'`

θα μετατρέψει όλα τα %20 σε κενά.

Υπάρχει κάτι έτοιμο που να το κάνει για όλα τα %xx;
Ναι, κατι σαν:

Κώδικας:
propername=$(printf $(echo -n $NAUTILUS_SCRIPT_SELECTED_URIS | sed 's/%\([0-9a-fA-F][0-9a-fA-F]\)/\\x\1/g'))
(το xx είναι απλά ο ASCII κωδικός του χαρακτήρα σε hex).
Απάντηση με παράθεση
  #3  
Παλιά 06-03-11, 17:58
Το avatar του χρήστη Archmage
Archmage Ο χρήστης Archmage δεν είναι συνδεδεμένος
Μέλος
 

Τελευταία φορά Online: 14-03-18 00:30
Φύλο: Άντρας
Αρχική Δημοσίευση από Qluser Εμφάνιση μηνυμάτων
το xx είναι απλά ο ASCII κωδικός του χαρακτήρα σε hex
Και με τα ελληνικά τι γίνεται; Είναι δύο % έκαστο...
__________________
may you live in interesting times
Απάντηση με παράθεση
  #4  
Παλιά 06-03-11, 18:04
Qluser Ο χρήστης Qluser δεν είναι συνδεδεμένος
Μέλος
 

Τελευταία φορά Online: 24-02-23 19:01
Αρχική Δημοσίευση από Archmage Εμφάνιση μηνυμάτων
Και με τα ελληνικά τι γίνεται; Είναι δύο % έκαστο...
Ναι, είναι UTF-8 αλλά το URL encoding δεν ξέρει από τέτοια πράγματα και απλά μετατρέπει non-ASCII bytes σε %xx. Μετά το decoding θα πάρεις αυτό που περιμένεις:


Κώδικας:
$ export NAUTILUS_SCRIPT_SELECTED_URIS=smb://myServer/myShare/my%20folder/%CF%84%CE%BF%20%CE%B1%CF%81%CF%87%CE%B5%CE%AF%CE%BF%20%CE%BC%CE%BF%CF%85
$ printf $(echo -n $NAUTILUS_SCRIPT_SELECTED_URIS | sed 's/%\([0-9a-fA-F][0-9a-fA-F]\)/\\x\1/g')
smb://myServer/myShare/my folder/το αρχείο μου
Απάντηση με παράθεση
Οι παρακάτω χρήστες έχουν πει 'Ευχαριστώ' στον/στην Qluser για αυτό το μήνυμα:
Archmage (06-03-11)
  #5  
Παλιά 06-03-11, 18:13
Το avatar του χρήστη Morgul
Morgul Ο χρήστης Morgul δεν είναι συνδεδεμένος
Άσωτος διαχειριστής
 

Τελευταία φορά Online: 26-03-22 21:02
Φύλο: Δεν έχω αποφασίσει ακόμα
Αρχική Δημοσίευση από Archmage Εμφάνιση μηνυμάτων
Και με τα ελληνικά τι γίνεται; Είναι δύο % έκαστο...
Τα ελληνικά γράμματα είναι δύο % έκαστο επειδή το encoding σου είναι UTF-8. Μια σημαντικά πιο αργή λύση σε Python (που είναι πάντα Unicode aware):

Κώδικας:
python -c 'import sys,urllib2;print urllib2.unquote(sys.argv[1]).decode("utf-8")' "%CF%84%CE%BF%20%CE%B1%CF%81%CF%87%CE%B5%CE%AF%CE%BF%20%CE%BC%CE%BF%CF%85"
Αυτό θα αποτύχει με exception αν το byte sequence δεν είναι σωστή ακολουθία UTF-8. Α ναι, προφανώς πρέπει να έχεις UTF-8 encoding στο stdout (πχ LC_CTYPE=xx_yy.UTF-8).
Απάντηση με παράθεση
  #6  
Παλιά 06-03-11, 18:25
Qluser Ο χρήστης Qluser δεν είναι συνδεδεμένος
Μέλος
 

Τελευταία φορά Online: 24-02-23 19:01
Αρχική Δημοσίευση από Morgul Εμφάνιση μηνυμάτων
Αυτό θα αποτύχει με exception αν το byte sequence δεν είναι σωστή ακολουθία UTF-8.
Βέβαια δεν υπάρχει κανένας λόγος να υποθέσουμε οτι πρέπει να είναι UTF-8. Ο server μπορεί να χρησιμοποιεί ότι charset/codepage θέλει :-/
Απάντηση με παράθεση
  #7  
Παλιά 06-03-11, 19:34
Το avatar του χρήστη Archmage
Archmage Ο χρήστης Archmage δεν είναι συνδεδεμένος
Μέλος
 

Τελευταία φορά Online: 14-03-18 00:30
Φύλο: Άντρας
Πρόκειται για το δικό μου samba share, δεν πρόκειται να το χρησιμοποιώ σε τυχαία remotes

Επειδή το ήθελα μέσα σε script τελικά η δουλειά φαίνεται πως έγινε με το:

clean_name=`printf $(echo ${dirty_name} | sed 's/%\([0-9a-fA-F][0-9a-fA-F]\)/\\\x\1/g')`

Δηλαδή υπάρχουν τρία \ πριν το x.

Έχει σημασία ότι το env | grep LC δε μου γυρίζει καθόλου LC_CTYPE;
__________________
may you live in interesting times
Απάντηση με παράθεση
Απάντηση στο θέμα


Συνδεδεμένοι χρήστες που διαβάζουν αυτό το θέμα: 1 (0 μέλη και 1 επισκέπτες)
 
Εργαλεία Θεμάτων
Τρόποι εμφάνισης

Δικαιώματα - Επιλογές
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is σε λειτουργία
Τα Smilies είναι σε λειτουργία
Ο κώδικας [IMG] είναι σε λειτουργία
Ο κώδικας HTML είναι σε λειτουργία

Που θέλετε να σας πάμε;


Όλες οι ώρες είναι GMT +3. Η ώρα τώρα είναι 15:08.



Forum engine powered by : vBulletin Version 3.8.2
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.