2015-03-10 2 views
1

Je veux être capable d'encoder un chemin pour l'utiliser comme URL, c.-à-d. Changer les espaces en% 20. Je trouve cette fonction qui fait l'encodage:Script zsh pour encoder le chemin complet du fichier

urlencode() { 
    setopt localoptions extendedglob 
    input=(${(s::)1}) 
    print ${(j::)input/(#b)([^A-Za-z0-9_.\!~*\'\(\)- ])/%${(l:2::0:)$(([##16]#match))}} 
} 

et veulent pouvoir passer les résultats de cette:

print -l $PWD/* | tail -1 

au function.ie obtenir le dernier chemin complet dans la liste des fichiers et l'encoder.

Je pensais que quelque chose comme ceci:

print -l $PWD/* | tail -1 | urlencode 

ou

print -l $PWD/* | tail -1 > urlencode 

fonctionnerait, mais ils ne le font pas.

Est-ce que quelqu'un sait comment l'accomplir?

Merci beaucoup

Répondre

1

Vous devez obtenir votre entrée de stdin plutôt que du premier argument.

Voici une façon d'adapter la fonction à faire

urlencode() { 
    setopt localoptions extendedglob 
    stdin=`while read line; do echo $line ;done` 
    input=(${(s::)stdin}) 
    print ${(j::)input/(#b)([^A-Za-z0-9_.\!~*\'\(\)- ])/%${(l:2::0:)$(([##16]#match))}} 
} 

Je l'ai testé sur mon terminal, il fonctionne

+0

Cela ne fonctionne pas pour moi: (1) Je pense que les espaces blancs a foiré quand vous avez copié et collé, et (2) il encode les barres obliques (séparateurs de chemin). Voici ce qui a fonctionné pour moi 'print $ {(j: :) input/(# b) ([^ A-Za-z0-9 _. \! ~ * \ '\ (\) - \ /]) /% $ { (l: 2 :: 0:) $ (([## 16] #match))}} ' – Von