我在Shell脚本中需要一些帮助。
我有一个文件夹,单字母文件夹名称以1开头,以小写字母z结尾:[1-9A-Za-z]
。
现在,我想将文件夹重命名为十六进制值:
1
至31
... z
至7A
。
我想用for循环解决这个问题,但现在我被困在这里了。 我从未使用Shell进行过编程,但使用的是C和ASM。
[编辑]:打开您的Terminfo文件夹。在OS X(10.9.1)上:/usr/share/terminfo
。
在那里你可以看到十六进制值。
现在,在我的iPhone上,它们是单个ASCII字符。因此终端找不到任何文件。
答案 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上测试。