Есть ли инструмент для urldecode имени файла и замены его?
Пример:
$ ls
hello%20world.txt
$ urldecode *.txt
$ ls
hello world.txt
Есть ли инструмент для urldecode имени файла и замены его?
Пример:
$ ls
hello%20world.txt
$ urldecode *.txt
$ ls
hello world.txt
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
Если исходные (входные) имена файлов содержат обратную косую черту, они, вероятно, будут искажены.
Я думаю, что этот фрагмент Perl можно использовать как основу для того, что вы ищете.
Введите в оболочке (или добавьте в .bashrc):
urldecode(){
mv $1 "`echo $1 | xargs python -c "import urllib, sys; print urllib.unquote(sys.argv[1])"`"
}
Использование:
$ urldecode *.txt
Проверено в bash, zsh. Кредиты
Новый пост в блоге освещает это с помощью 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
}