Nazwa pliku kodu urld Linux

2

Czy jest jakieś narzędzie do urldecode nazwy pliku i zastąpienia go?

Przykład:

$ ls
hello%20world.txt
$ urldecode *.txt
$ ls
hello world.txt
Flawiusz
źródło

Odpowiedzi:

1

Nowy wpis na blogu obejmuje to z echo(1)a printf(1).

urldecode() {
  arg="$1"
  i="0"
  while [ "$i" -lt ${#arg} ]; do
    c0=${arg:$i:1}
    if [ "x$c0" = "x%" ]; then
      c1=${arg:$((i+1)):1}
      c2=${arg:$((i+2)):1}
      printf "\x$c1$c2"
      i=$((i+3))
    else
      echo -n "$c0"
      i=$((i+1))
    fi
  done
}
Tłumienie ognia
źródło
3

sedi echomoże urldececode nazwę pliku tak:

$ echo -e "$(echo hello%20world+ok | sed 's/+/ /g;s/%\(..\)/\\x\1/g;s/\\x\(2[Ff]\)/%\1/g')"
hello world ok

Chcemy, aby była w stanie zamienić nazwy plików na nazwy plików, a nie nazwy ścieżek (tzn. Nie chcemy dodawać ukośników), więc zostawiamy w %2Fspokoju. (Mówiąc ściślej, zmieniamy \x2F się w %2F.)

$ echo -e "$(echo cat+dog%20foo%21%22%23%24%25%26%27%28%29%2A%2B%2C%2D%2E%2Fbar |
                                    sed 's/+/ /g;s/%\(..\)/\\x\1/g;s/\\x\(2[Ff]\)/%\1/g')"
cat dog foo!"#$%&'()*+,-.%2Fbar

Aby faktycznie zmienić nazwę plików w bieżącym katalogu:

$ ls *.txt
hello%20%20world++ok?.txt
$ for f in *.txt; do 
>   mv "$f" "$(echo -e "$(echo "$f" | sed 's/+/ /g;s/%\(..\)/\\x\1/g;s/\\x\(2[Ff]\)/%\1/g')")"
> done
$ ls *.txt
hello  world  ok?.txt

Jeśli oryginalne (wejściowe) nazwy plików zawierają ukośniki odwrotne, prawdopodobnie zostaną zniekształcone.

Tłumienie ognia
źródło
Chodzi tutaj o to, aby zamieniać „+” bezpośrednio w spacje i zamieniać znaki% w znaki ucieczki „\ x”, a następnie pozwolić echu interpretować znaki ucieczki \ x za pomocą opcji „-e”. Spróbuj uruchomić „echo -e 'hello \ x20world”, aby zobaczyć to w akcji.
Suppressingfire
Co powiesz na część, w której zmienia nazwę pliku (ów)?
SamB
@SamB: pozostawiono jako ćwiczenie dla czytelnika :-)
Suppressingfire
Wygląda na to, że nie działa we wszystkich przypadkach, nazwy plików, które 10%20-%203%20-%20Model%20Selection%20and%20Train%2FValidation%2FTest%20Sets%20%2812%20min%29.mp410%20-%203%20-%20Model%20Selection%20and%20Train%2FValidation%2FTest%20Sets%20%2812%20min%29.mp410%20-%205%20-%20Regularization%20and%20Bias%2FVariance%20%2811%20min%29.mp410%20-%205%20-%20Regularization%20and%20Bias%2FVariance%20%2811%20min%29
zawodzą
1

Wpisz shell (lub dodaj do .bashrc):

urldecode(){
    mv $1 "`echo $1 | xargs python -c "import urllib, sys; print urllib.unquote(sys.argv[1])"`"
}

Stosowanie:

$ urldecode *.txt

Testowane w bash, zsh. Kredyty .

Dmitrij Sandałow
źródło