字符为十六进制

时间:2014-01-08 23:14:52

标签: shell hex ascii

我在Shell脚本中需要一些帮助。 我有一个文件夹,单字母文件夹名称以1开头,以小写字母z结尾:[1-9A-Za-z]。 现在,我想将文件夹重命名为十六进制值: 131 ... z7A

我想用for循环解决这个问题,但现在我被困在这里了。 我从未使用Shell进行过编程,但使用的是C和ASM。

[编辑]:打开您的Terminfo文件夹。在OS X(10.9.1)上:/usr/share/terminfo。 在那里你可以看到十六进制值。 现在,在我的iPhone上,它们是单个ASCII字符。因此终端找不到任何文件。

2 个答案:

答案 0 :(得分:2)

要将具有单字符名称的目录重命名为该名称的ascii十六进制值:

for dir in [1-9A-Za-z]
do
    mv "$dir" "$(printf  "${2:-%x}" "'$dir")"
done

以上是基于使用bash将ascii转换为hex的代码。因此,此脚本将作为其第一个参数给出的字符转换为其ascii十六进制值:

#!/bin/sh
printf  "${2:-%x}\n" "'$1"

因此,例如,如果您将该脚本放在名为char2hex.sh的可执行文件中:

$ bash char2hex.sh 1
31
$ bash char2hex.sh z
7a

更多信息:以下信息针对此问题的第一个版本,要求提供小数值:

此脚本将作为第一个参数给出的字符转换为其ascii十进制值:

#!/bin/sh
printf  "${3:-%d}\n" "'$1"

因此,例如,如果您将该脚本放在名为char2hex.sh的可执行文件中:

$ char2hex.sh z
122

答案 1 :(得分:0)

在任何适当的目录中,您可以尝试:

$ mkdir terminfo
$ cd terminfo
$ mkdir {0..9} {a..z}
$ ls
0   3   6   9   c   f   i   l   o   r   u   x
1   4   7   a   d   g   j   m   p   s   v   y
2   5   8   b   e   h   k   n   q   t   w   z
$ for d in ?; do mv "$d" $(printf "%2X" "'$d'"); done
$ ls
30  33  36  39  63  66  69  6C  6F  72  75  78
31  34  37  61  64  67  6A  6D  70  73  76  79
32  35  38  62  65  68  6B  6E  71  74  77  7A
$

如果您使用echo mv而不是mv,则可以看到shell执行的操作。您可以使用%2x代替%2X来获取7a之类的名称,这些名称与我在计算机上的/usr/share/terminfo中看到的名称相匹配(但文件系统是保留大小写的,不区分大小写,所以大写应该工作)。您也可以考虑使用ln -s代替mv;这样,你可以使用旧名称和新名称,因此旧代码和新代码应该很高兴。

在Mac OS X 10.9.1 Mavericks上测试。