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

简介:

一、题目

指定目录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.执行。

方案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,哈哈!

四、总结

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

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

相关文章
|
5天前
|
数据安全/隐私保护 Python
Python文件与目录操作:面试中的高频考点
【4月更文挑战第15天】本文介绍了Python文件和目录操作的面试重点,包括文件的读写、目录遍历及权限管理。强调了文件关闭、异常处理、特殊文件判断以及权限位和权限字符串的理解。提供了代码示例,如读写文件、遍历目录和更改文件权限,帮助读者在面试中表现出色。掌握这些技能将对编程求职之路大有裨益。
17 0
|
6月前
|
存储 Java 索引
【面试题精讲】字节码文件的组成
【面试题精讲】字节码文件的组成
|
8月前
|
Java 关系型数据库 MySQL
阿里面试官(性能优化):描述一下jvm加载class文件的原理机制?
相信很多人对于性能优化都不陌生,为了获得更好的系统性能,或者是为了满足不断增加的业务需求。 都需要用到我们的性能调优。所以性能优化在面试中出现的频率特别高 楼主自认为自己对性能优化相关知识有很多了解,而且因为最近在找工作面试,所以单独复习了很多关于索引的知识。
|
数据处理
海量数据处理面试题:给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?
海量数据处理面试题:给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?
507 0
海量数据处理面试题:给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?
|
运维 安全 Linux
Linux 面试必考-IO文件重定向及管道深入讲解| 学习笔记
快速学习 Linux 面试必考-IO 文件重定向及管道深入讲解
117 0
Linux 面试必考-IO文件重定向及管道深入讲解| 学习笔记
|
运维 安全 Linux
Linux面试必考-IO文件重定向及管道深入讲解| 学习笔记
快速学习 Linux面试必考-IO文件重定向及管道深入讲解
149 0
  Linux面试必考-IO文件重定向及管道深入讲解| 学习笔记
|
运维 Java Linux
Linux面试必备-find文件查找企业级用法进阶| 学习笔记
快速学习Linux面试必备-find文件查找企业级用法进阶
120 0
|
关系型数据库 MySQL 测试技术
软件测试mysql面试题:编辑start.sh文件,查看文件前10行内容和后10行内容
软件测试mysql面试题:编辑start.sh文件,查看文件前10行内容和后10行内容
109 0
|
Linux 测试技术
软件测试Linux面试题:三种查看server.log的文件内容
软件测试Linux面试题:三种查看server.log的文件内容
371 0
|
Linux 测试技术
软件测试Linux面试题:简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程
软件测试Linux面试题:简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程
130 0