Linux urldecode 文件名

Linux urldecode 文件名

是否有任何工具可以对文件的名称进行 urldecode 并替换它?

例子:

$ ls
hello%20world.txt
$ urldecode *.txt
$ ls
hello world.txt

答案1

A新博客文章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
}

答案2

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

我认为这个 Perl 代码片段可以作为您正在寻找的内容的基础。

答案4

输入 shell(或添加到.bashrc):

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

用法:

$ urldecode *.txt

在 bash、zsh 中测试。致谢

相关内容