nome do arquivo do urldecode do Linux

2

Existe alguma ferramenta para redigitar o nome de um arquivo e substituí-lo?

Exemplo:

$ ls
hello%20world.txt
$ urldecode *.txt
$ ls
hello world.txt
    
por Flavius 29.11.2009 / 15:51

4 respostas

1

Uma nova postagem no blog aborda isso com echo(1) e 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
}
    
por 06.12.2009 / 17:31
3

sed e echo podem urldecode o nome de um arquivo da seguinte forma:

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

Queremos que isso seja capaz de transformar nomes de arquivos em nomes de arquivos, em vez de nomes de caminhos (ou seja, não queremos adicionar barras), então deixamos %2F sozinho. (Para ser mais preciso, transformamos \x2F de volta em %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/g;s/\x\(2[Ff]\)/%/g')"
cat dog foo!"#$%&'()*+,-.%2Fbar

Para renomear arquivos no diretório atual:

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

Se os nomes de arquivo originais (entrada) contiverem barras invertidas, eles provavelmente serão mutilados.

    
por 29.11.2009 / 16:31
1

Acho que este snippet Perl pode ser usado como base para o que você está procurando.

    
por 29.11.2009 / 16:18
1

Digite shell (ou adicione a .bashrc):

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

Uso:

$ urldecode *.txt

Testado em bash, zsh. Créditos .

    
por 08.05.2015 / 23:29

Tags