awk遍历目录修改文件名

有一系列目录下有相同的文件名,需要批量在此文件名前面加上所在目录名,再copy到/tmp下。这个需求在ansible批量拉取远程目录文件时会遇到。 举例:

[root@node2 ~]# tree test/
test/
├── 10.30
│   └── a.txt
├── 10.31
│   └── a.txt
├── rc.txt
└── t.sh

2 directories, 4 files
[root@node2 ~]# find test/ -name a.txt
test/10.30/a.txt
test/10.31/a.txt

需要将a.txt分别改名为test_10.30_a.txt,test_10.31_a.txt,并拷贝到/tmp

[root@node2 ~]# find test/ -name a.txt |awk 'BEGIN{FS="/";OFS="_"}{printf "cp "$0;$1=$1;print " /tmp/"$0}'
cp test/10.30/a.txt /tmp/test_10.30_a.txt
cp test/10.31/a.txt /tmp/test_10.31_a.txt
  • FS是原始列的分隔符,OFS是新定义的列分隔符,$1=$1是为了让新定义的分隔符强制生效
  • printf "cp "$0;$1=$1;print " /tmp/"$0 相当于拼凑了一句cp的命令。printf是为了cp test/10.30/a.txt后面不带换行符,而后面的print是为了输出换行符。
  • "cp "可以换成别的,比如mv,但是,这样只是输出了命令,并没有执行,要执行需要|sh
[root@node2 ~]# find test/ -name a.txt |awk 'BEGIN{FS="/";OFS="_"}{printf "cp "$0;$1=$1;print " /tmp/"$0}'|sh
[root@node2 ~]# ll /tmp/*txt
-rw-r--r-- 1 root root 0 8月  23 10:55 /tmp/test_10.30_a.txt
-rw-r--r-- 1 root root 0 8月  23 10:55 /tmp/test_10.31_a.txt

转载于:https://my.oschina.net/u/3746745/blog/1932624

你可能感兴趣的:(awk)