Linux urldecode имя файла

Там какой-либо инструмент является к urldecode именем файла, и замените его?

Пример:

$ ls
hello%20world.txt
$ urldecode *.txt
$ ls
hello world.txt
2
задан 04.11.2014, 16:41

3 ответа

Новое сообщение в блоге покрывает это echo(1) и 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
}
1
ответ дан 08.12.2019, 05:32

sed и echo может urldecode имя файла как так:

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

Мы хотим, чтобы это смогло превратить имена файлов в имена файлов, а не пути (т.е. мы не хотим добавлять наклонные черты), таким образом, мы уезжаем %2F один. (Чтобы быть более точными, мы поворачиваемся \x2F назад в %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

На самом деле переименовать файлы в текущем каталоге:

$ 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

Если оригинал (вход), имена файлов содержат обратные косые черты, они будут, вероятно, искажены.

3
ответ дан 08.12.2019, 05:32

Я думаю, что этот отрывок Perl может использоваться в качестве основы для того, что Вы ищете.

1
ответ дан 08.12.2019, 05:32

Теги

Похожие вопросы