前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一道关于文件批量查找并替换内容并移动文件且将其按规则重命名的面试题

一道关于文件批量查找并替换内容并移动文件且将其按规则重命名的面试题

作者头像
耕耘实录
发布2018-12-20 15:44:57
8180
发布2018-12-20 15:44:57
举报
文章被收录于专栏:耕耘实录耕耘实录

版权声明:本文为耕耘实录原创文章,各大自媒体平台同步更新。欢迎转载,转载请注明出处,谢谢

一、题目

指定目录from_dir下面有一些csv文件,要求找出这一类文件,并把文件内的Tab符替换成逗号,并将文件的扩展名改为.tsv并存放于to_dir目录。请写一个shell脚本。

二、思路

1.找出扩展名为.csv的文件可以用find命令,注意是文件。

代码语言:javascript
复制
find $from_dir/ -name "*.csv" -type f

2.将文件内的Tab符替换为逗号,使用sed。

代码语言:javascript
复制
sed -i 's/\t/,/g' $Name

3.把文件扩展名修改为tsv并存放于to_dir。

代码语言:javascript
复制
mv $Name $to_dir/$str
三、实现

1.建立实验文件,文件内包括Tab符。

代码语言:javascript
复制
#!/bin/bash
for FILE in aa bb cc ab bc ac  
        do  
                echo -e '\t'>>$FILE.csv
        done

2.具体实现方案。 方案1:

代码语言:javascript
复制
#!/bin/bash
from_dir="/root"
to_dir="/opt"
for Name in `find $from_dir/ -name "*.csv" -type f`
        do  
                sed -i 's/\t/,/g' $Name
                File=$(echo $Name|awk -F "/" '{ print $NF }')
                echo $File>FileName
                sed -i 's/.csv/.tsv/g' FileName
                str=`cat FileName`
                mv $Name $to_dir/$str
                rm -rf FileName
        done

方案2:

代码语言:javascript
复制
#!/bin/bash
from_dir="/root"
to_dir="/opt"
cd $from_dir
for File in `find -name "*.csv" -type f`
        do  
                sed -i 's/\t/,/g' $File
        done
find -name "*.csv" -type f -exec mv {} $to_dir/{} \;
rename .csv .tsv $to_dir/*.csv

简直不要太简单! 方案3:

代码语言:javascript
复制
#!/bin/bash
from_dir="/root"
to_dir="/opt"
for File in `ls -l $from_dir/*|awk '{print $NF}'|grep ".csv$"`
        do  
                sed -i 's/\t/,/g' $File
                echo $File>Temp.txt
                NewFile=`awk -F "." '{print $1}' Temp.txt|awk -F "/" '{print $NF}'`
                        if [ -f $File ] ; then  
                                mv $File $to_dir/$NewFile.tsv
                                rm -rf Temp.txt
                        fi  
        done

3.执行。 方案1执行结果:

代码语言:javascript
复制
[root@ChatDevOps ~]# source Script.sh
[root@ChatDevOps ~]# ll
总用量 8
-rw-r--r--. 1 root root 215 5月   7 19:50 Script.sh
-rw-r--r--. 1 root root  79 5月   7 18:52 test.sh
[root@ChatDevOps ~]# ll /opt/
总用量 24
-rw-r--r--. 1 root root 2 5月   7 19:50 aa.tsv
-rw-r--r--. 1 root root 2 5月   7 19:50 ab.tsv
-rw-r--r--. 1 root root 2 5月   7 19:50 ac.tsv
-rw-r--r--. 1 root root 2 5月   7 19:50 bb.tsv
-rw-r--r--. 1 root root 2 5月   7 19:50 bc.tsv
-rw-r--r--. 1 root root 2 5月   7 19:50 cc.tsv
[root@ChatDevOps ~]# cat /opt/aa.csv 
,

目标实现,继续寻找其他方案。

方案2执行结果:

代码语言:javascript
复制
[root@ChatDevOps ~]# source Script.sh 
[root@ChatDevOps ~]# ll /opt/
总用量 24
-rw-r--r--. 1 root root 4 5月   7 20:31 aa.tsv
-rw-r--r--. 1 root root 4 5月   7 20:31 ab.tsv
-rw-r--r--. 1 root root 4 5月   7 20:31 ac.tsv
-rw-r--r--. 1 root root 4 5月   7 20:31 bb.tsv
-rw-r--r--. 1 root root 4 5月   7 20:31 bc.tsv
-rw-r--r--. 1 root root 4 5月   7 20:31 cc.tsv
[root@ChatDevOps ~]# cat /opt/aa.tsv 
,

再想一想,看看怎么写方案3,哈哈! 方案3执行结果:

代码语言:javascript
复制
[root@ChatDevOps ~]# source Script.sh
[root@ChatDevOps ~]# ll /opt/
总用量 24
-rw-r--r--. 1 root root 2 5月   8 23:55 aa.tsv
-rw-r--r--. 1 root root 2 5月   8 23:55 ab.tsv
-rw-r--r--. 1 root root 2 5月   8 23:55 ac.tsv
-rw-r--r--. 1 root root 2 5月   8 23:55 bb.tsv
-rw-r--r--. 1 root root 2 5月   8 23:55 bc.tsv
-rw-r--r--. 1 root root 2 5月   8 23:55 cc.tsv
[root@ChatDevOps ~]# cat /opt/aa.tsv 
,

方案3是受到朋友启发写出来的,另辟蹊径哈!至此,此道题将grep、sed、awk都融合进来了,暂时就这样吧!

四、总结

1.在回答这道题的时候,容易陷入一种一个语句实现全部功能的怪圈,没理解清楚题目,文件名中是不可能有Tab符的。这道题目前可能还有Bug,我再考虑一下,其他实现方式我也再想想。

2.方案2其实有个缺陷,万一$to_dir之前就存在.csv的文件呢?都全部被我们重命名了!需要改进一下,可以创建一个临时目录,把find到的文件先移动到这个空目录,然后重命名,最后再移到$to_dir。当然也可以用find命令加exec再次处理,判定修改时间小于2分钟,才重命名。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年05月07日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、题目
  • 二、思路
  • 三、实现
  • 四、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档