背景
批量重命名一批目录名称为指定名称(把一批以主机名称命名的目录,修改为以对应的ip地址命名)
例如有一批目录为:
[root@local ~]# ll
total 60
-rw-r--r-- 1 root root 1551 Apr 20 14:36 a.txt
-rw-r--r-- 1 root root 102 Apr 20 15:04 b.sh
-rw-r--r-- 1 root root 648 Apr 7 17:24 deploy_hugo.sh
-rw-r--r-- 1 root root 113 Apr 1 14:23 hugo_new.sh
drwxr-xr-x 2 root root 4096 Apr 25 16:57 iZf5safGSwahR2TE42gqraZ
drwxr-xr-x 2 root root 4096 Apr 25 16:57 iZkAsafGSwahR2kjhggqraZ
drwxr-xr-x 2 root root 4096 Apr 25 16:57 iZkAsafGSwahR2TE42124aZ
drwxr-xr-x 2 root root 4096 Apr 25 16:57 iZkAsafGSwahR2TE42gqraZ
drwxr-xr-x 2 root root 4096 Apr 25 16:57 iZkAsafGSwahR2TEa2g7raZ
drwxr-xr-x 2 root root 4096 Apr 25 16:57 iZkAsafGSwahR2ToplgqraZ
drwxr-xr-x 2 root root 4096 Apr 25 16:57 iZkAsafGSwahRasta2gqraZ
drwxr-xr-x 2 root root 4096 Apr 25 16:57 iZkAsafGSwahRdsh42gqraZ
drwxr-xr-x 2 root root 4096 Apr 25 16:57 iZkAsafGSwahRskd2g5qraZ
drwxr-xr-x 2 root root 4096 Apr 25 16:57 iZkAwrfGSwahR2TE09gqraZ
[root@local ~]# cat a.txt
iZkAsafGSwahR2TE42gqraZ 10.10.0.1
iZkAsafGSwahR2TE42124aZ 10.10.0.2
iZkAsafGSwahR2TEa2g7raZ 10.10.0.3
iZkAsafGSwahRasta2gqraZ 10.10.0.4
iZkAsafGSwahRskd2g5qraZ 10.10.0.5
iZkAsafGSwahRdsh42gqraZ 10.10.0.6
iZkAsafGSwahR2kjhggqraZ 10.10.0.7
iZkAwrfGSwahR2TE09gqraZ 10.10.0.8
iZf5safGSwahR2TE42gqraZ 10.10.0.9
iZkAsafGSwahR2ToplgqraZ 10.10.0.10
....
...
已经整理出主机名称与ip地址对应的文本文件a.txt。
思路1
使用 sed 循环打印每一行 | awk 打印列数 |(两个变量分别赋值) | mv $1 $2
#!/bin/bash
for i in {1..43}
do
host=$(sed -n "${i}p" a.txt | awk '{print $1}')
ip=$(sed -n "${i}p" a.txt | awk '{print $2}')
mv $host $ip
done
执行报错:
sed: -e expression #1, char 0: unmatched `{'
这样是可以的,注意sed需要使用""双引号才能引用变量.
思路2
于是想到用for循环嵌套。
#!/bin/bash
for host in `cat a.txt | awk '{print $1}'`
do
for ip in `cat a.txt | awk '{print $2}'
do
mv $host $ip
continue
done
done
经测试也失败了。。。
思路3
最后想到while read可以循环读取文本内容,并且支持赋值给多个变量,正好符合我们的需求。while结构中,read命令是需要从标准输入中读取数据的。
使用循环重定向的写法:
#!/bin/bash
#IPS=
while read host ip
do
ip=`echo $host | sed 's/\./-/g'`
mv $host $ip
done < a.txt
对变量$ip中的 . 做一下处理,使其变成10-10-0-1的形式。
read通过输入重定向,把a.txt的第一行所有的内容分别赋值给变量 $host 和 $ip;通过mv命令重命名主机名为ip地址。然后循环处理file的第二行、第三行。。。一直到file的最后一行。
read 使用IFS作为分隔符读文件,默认情况下IFS是空格,如果需要使用其它的需要重新赋值。
IFS=: