shell 十六进制字符

xhv8bpkk  于 12个月前  发布在  Shell
关注(0)|答案(2)|浏览(169)

我需要一些Shell脚本的帮助。我有一个文件夹,文件夹名都是单字母的,以1开头,以小写字母z结尾:[1-9A-Za-z]。现在,我想将文件夹重命名为十六进制值:131. z7A
我想用for循环来修复这个问题,但现在我被困在这里了。我从来没有用Shell编程,而是用C和ASM。
[编辑]:打开Terminfo文件夹。在OS X(10.9.1)上:/usr/share/terminfo。在这里你可以看到十六进制值。现在,在我的iPhone上,它们是单个ASCII字符。因此终端找不到任何文件。

6yoyoihd

6yoyoihd1#

要将具有单字符名称的目录重命名为该名称的十六进制值,请执行以下操作:

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

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

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

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

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

**更多:**以下信息是针对这个问题的第一个版本,它要求十进制值:

此脚本将作为第一个参数给出的字符转换为它的ascurrentdecimal值:

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

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

$ char2hex.sh z
122
k4ymrczo

k4ymrczo2#

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

$ 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上测试。

相关问题