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

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

一、题目

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

二、思路

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

find $from_dir/ -name "*.csv" -type f

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

sed -i 's/\t/,/g' $Name

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

mv $Name $to_dir/$str

三、实现

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

#!/bin/bash
for FILE in aa bb cc ab bc ac  
        do  
                echo -e '\t'>>$FILE.csv
        done

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

#!/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:

#!/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:

#!/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执行结果:

[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执行结果:

[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执行结果:

[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分钟,才重命名。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Ken的杂谈

Nginx配置SSL证书将网站从HTTP升级到HTTPS

HTTPS全称是:超文本安全传输协议,可以简单理解为使用SSL加密传输的HTTP协议,HTTP的默认端口是80,HTTPS的默认端口是443。SSL是为网络通信...

74540
来自专栏Laoqi's Linux运维专列

设置grub密码

15030
来自专栏云计算教程系列

如何在CentOS 7上安装和配置ownCloud

ownCloud是一个文件共享服务器,允许您将个人内容(如文档和图片)集中存储在此位置,就像Dropbox一样。与ownCloud的不同之处在于它是免费的开源软...

1.1K00
来自专栏Java学习123

windows下使用curl命令 && 常用curl命令

52780
来自专栏运维一切

sentry部署整理 原

sentry是python开发的一个应用,使用python uWSG框架运行,所有安装完sentry要记得在nginx的代理上禁用掉/admin路径,不然uws...

27610
来自专栏cmazxiaoma的架构师之路

MyEclipse使用Git进行Push to Upstream报错 学习笔记

10620
来自专栏王磊的博客

svn 客户端批量备份数据(图+文)

缘由 商业用途的规则,数据与谨慎便成了不可替代的王道,我今天也说svn,在客户端批量备份数据。 前提 考虑跨平台与易用性,选择批处理(.bat),既然是批处理,...

40180
来自专栏Java学习123

windows环境下 curl 安装和使用

41160
来自专栏张戈的专栏

Linux系统编译安装Redis以及主从复制配置小记

Redis 的安装配置很简单,而且很早之前就装过 Redis,可这几天再次安装时居然又遗忘了一些细节,看来好记性不如烂笔头,还是在博客记录一下比较好,至少不用总...

29630
来自专栏农夫安全

【补充】任意密码重置姿势

跟第三个有点类似,只判断了接收端和验证码是否一致,未判断接收端是否和用户匹配,因此修改接收端可达到重置目的

12620

扫码关注云+社区

领取腾讯云代金券