专栏首页耕耘实录一道关于文件批量查找并替换内容并移动文件且将其按规则重命名的面试题

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

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

一、题目

指定目录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 条评论
登录 后参与评论

相关文章

  • CentOS7.4中Docker以rw方式挂载volume报Permission denied的解决思路

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

    耕耘实录
  • Linux修改用户名及相关信息(包括root)

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

    耕耘实录
  • Linux 系统中查找正在运行的进程的完整命令、当前工作目录等信息的方法

    在某些系统故障的排查过程中,需要找出某个应用程序的工作目录、完整命令行等信息。通常会通过ps及top等命令来查看进程信息,但往往只能查到相对路径、部分命令行等。...

    耕耘实录
  • Centos7中find命令的用法,以及find+exec,find+xargs

    find . | xargs grep -ri ‘content’ //find . | xargs grep -ril ‘content’ 只显示文件名称 ...

    拓荒者
  • Linux中find命令的点滴积累

    find 命令在Linux中的作用非常强大,对于初学者来说,可能有很多的参数并不能很熟练的使用,导致无法充分发挥find的强大作用;本文对部分参数做初步的探索:

    qsjs
  • LeetCode 450: 删除二叉搜索树中的节点 Delete Node in a BST

    给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节...

    爱写bug
  • Linux系统下如何查看及修改文件读写权限

    查看文件权限的语句:   在终端输入: ls -l xxx.xxx (xxx.xxx是文件名)   那么就会出现相类似的信息,主要都是这些: -rw-rw-r-...

    猿人谷
  • Linux堡垒机Jumpserver安装

    Jumpserver是一款由python编写, Django开发的开源跳板机/堡垒机系统, 助力互联网企业高效 用户、资产、权限、审计 管理。jumpserve...

    菲宇
  • 等保测评2.0之Centos安全审计

    在进行等级保护测评时,需要检查主机的安全审计功能,这里就以等级保护2.0来说一说centos6在这方面的检测,以下是安全计算环境的安全审计控制点中的测评项。

    FB客服
  • Linux虚拟化技术—CentOS7.4下KVM虚拟化一 安装配置及基本操作

    第一部分 实验环境 Linux服务器一台 IP地址:192.168.80.40(kvm01)

    拓荒者

扫码关注云+社区

领取腾讯云代金券