每日一道shell 练习(05)——批量打包文件

1. 习题

找到 /123 目录下所有后缀名为 .txt 的文件

  • 批量修改.txt 为 .txt.bak
  • 把所有.bak 文件打包压缩为 123.tar.gz
  • 批量还原文件的名字,即把增加的.bak 再删除

2. 习题分析

  1. 首先要想办法找出 .txt 结尾的文件,用 find 命令。
  2. 打包命令用 tar czvf 就可以搞定了,关键是如何同时将所有 .bak 文件打包。
  3. 还原文件名有点复杂,关键是如何找到原来的文件名。

3. 具体脚本

在脚本总已经加进了我的分析,可以看看

[[email protected] work]# cat file_tar.sh
#!/bin/bash

# 将符合条件的,以.txt 结尾的文件,保存到 /tmp/file.txt
find /usr/local/sbin/work/ -maxdepth 1 -type f -name "*.txt" > /tmp/file.txt

# 用循环逐行读取 /tmp/file.txt 文件,修改文件名为 .txt.bak
while read line ;
do
  mv $line $line.bak
done</tmp/file.txt

# 由于要压缩打包,所以,创建一个目录,将文件复制到这个目录,再打包
# 用时间戳来区分目录
d=`date +%Y%m%d%H%M%S`
mkdir /tmp/123_$d

for f in `cat /tmp/file.txt`;
do
  cp $f.bak   /tmp/123_$d
done

# 开始打包
cd /tmp
tar czf  123.tar.gz  ./123_$d

# 恢复文件名
for f in `cat /tmp/file.txt`;
do
  mv $f.bak $f
done

【分析】

  1. 如果只是遍历目录,找出某种文件,然后修改一下文件名,其实一条命令就可以搞定:
find  /usr/local/sbin/work  -type f -name "*.txt"  -print0 | xargs -d ‘\0‘  mv {}  {}.bak

要注意,find 命令的查找路径需要使用绝对路径,不要用相对路径。如果用 xargs 命令接在后面,则用 -print0 选项,将某些包含空格的特殊文件名,也包含在内,不会处理错误。

  1. 脚本中的 while 循环这种方式其实也是很常见的,将结果临时保存在一个文件中,然后再通过while 循环读取处理。
  2. 大家看到脚本中多次使用 /tmp/file.txt 这个文件了吧。将 .txt 结尾的文件保存到一个文件中,这种办法就恨到地解决了我们在习题分析中提出的第3个问题啦。
  3. 我的所有.txt 结尾的文件都在 /usr/local/src/sbin/work 目录。

? 如果你没有 .txt 结尾的文件,可以用下面的命令生成一堆,用来做实验:

for  i in `seq  30`;do  touch  $i.txt;done

? 这样就可以生成30个 .txt 结尾的文件用来做实验了。

4. 结语

今天的习题帮大家复习了find命令,xargs 命令,还有for 循环,while 循环的常见用法,关键是学习那种处理问题的思路。

?

原文地址:http://blog.51cto.com/hellocjq/2111993

时间: 2024-10-11 10:22:32

每日一道shell 练习(05)——批量打包文件的相关文章

每日一道shell练习(06)——检测端口服务

1. 题目 写一个脚本,判断本机的80端口(假设服务为httpd)是否开启着,如果开启着就什么都不做,如果发现端口不存在,那么重启一下httpd服务,并发邮件通知你自己.脚本写好后,每分钟执行一次,也可以写一个死循环的脚本,30S检查一次. 2. 习题分析 首先,我们要区分要求,这里的要求是检测80端口是否在监听,而不是检测httpd服务是否运行,虽然两者有一定的联系,但并不是对等的关系.检测端口状态用 netstat -lntp 命令.如果要求检测远程主机的端口状态,则用一下的命令: nmap

每日一道shell脚本练习(01)

0. 引言 准备开一个新坑,每天更新一道shell练习.因为shell脚本属于那种不练习就会生疏,甚至忘记的技能,所以,为了对抗遗忘阻力,我只能不断加强练习了. 1. 第一天练习题目 [题目]请按照这样的日期格式(xxxx-xx-xx)每日生成一个文件,例如今天生成的文件为2018-04-08.log,并且把磁盘的使用情况写到这个文件中,不用考虑cron,仅仅写脚本即可. [分析]第一点,要明白 linux 命令 date 的用法,打印"xxxx-xx-xx"这样的时间格式用date

每日一道shell练习(03)

1 . 习题 写一个脚本计算linux系统所有进程占用内存大小的和 2. 习题分析 2.1.第一个问题,在哪里收集进程的数据 用top或者ps都可以获取每个进程的内存使用大小.获得大小之后,就可以通过一个循环计算它们的和了. 2.2. ps 命令的问题 通过累加 "ps aux" 命令显示的 RSS 列来统计全部进程总共占用的物理内存大小,这是不对的.因为,RSS(resident set size)表示常驻内存的大小,但是由于不同的进程之间会共享内存,所以把所有进程RSS进行累加的方

每日一道shell练习(04)

1. 习题 设计一个脚本,监控远程的一台主机(假设 ip地址是110.110.110.114)的存活状态,当发现宕机时发一封邮件给你自己. 提示: 你可以使用 ping 命令 : ping -c 10 110.110.110.114 脚本可以搞成死循环. 2. 习题分析 其实这中需求并不困难,题目也给出了思路.关键是确定一个阈值,当检测到结果符合阈值,就触发警告,发送警告邮件. 我们可以先在主机上尝试执行一下 ping -c 命令: [[email protected] work]# ping

每日一道shell练习(09)——sed处理

1. 习题 对一个文件,1至5行删除带有英文的行,6至10行删除里面的英文字符: 2. 分析 这种要求,用sed命令就可以解决了,主要用到匹配替换的知识. 3. 脚本 #!/bin/bash sed -n '1,5p' a.txt | sed '/[a-zA-Z]/d' sed -n '6,10p' a.txt | sed 's/[a-zA-Z]//g' sed -n '11,$p' a.txt 前两个要求,必须使用行号匹配.主要sed是一个流编辑处理器,它是一行一行地接收输入数据,然后再处理.

每日一道shell练习(10)——统计字符数

1. 习题 将下面这句话中字符数在6以内的单词打印出来: Bash also interprets a number of multi-character options . 2. 习题分析 思路:用for循环将每个单词取出,才能单独统计.for循环的分隔符有空格.tab键和回车键,刚好这句话的分隔符是空格键. 3. 脚本 #!/bin/bash line='Bash also interprets a number of multi-character options .' sum=0 for

iOS 批量打包--Shell脚本

由于公司有批量打包的需要,只是渠道号不一样,网上搜索一番,大致有两个方式:a) 从源程序一次性打出所有渠道的ipa包,大概的思路就是利用脚本循环执行打包过程,而每次打包前都通过脚本修改项目中存放渠道号的文件为当前循环的最新渠道号,让后逐个打包.b) 提供一个ipa格式的母包 从母包生成其它所有的渠道包,可能你会问:用一个包生成其他的包可行么??原因是这样的:因为每个渠道只是渠道号发生变化,而其他的内容又不会发生变化,而我们的渠道号又是存储在Info.plist这个文件中的,所以只要改变母包中的I

shell练习题:使用for循环批量修改文件扩展名

shell练习题:使用for循环批量修改文件扩展名 说明:(1)在linux下批量修改文件名,将下图所示命令中的"_linux"去掉. (2)使用for循环脚本. 思路:本题的基本解题思路,先进行单个文件的改名,然后再用循环实现批量改名,这是比较常规的做法,也可以用rename专业改名工具. 方法一: 说明:使用cut.sed工具 脚本如下: #!/bin/bash cd /test for i in `ls|grep .*.jpg` do mv $i `echo $i |cut -d

Unity3D脚本批量打包渠道包

最近在研究Unity3D脚本批量打包,比如在Android平台下各种不同分辨率和不同内存大小的机器,可能还有不同的渠道包,不同渠道可能用的SDK都不一样,这一切的一切都表明你的代码无法做到自适应的,除非批量打包提供各个平台的预定义标签#define . Unity默认提供了一些预定义标签如: UNITY_EDITOR  : 编辑器模式下. UNITY_STANDALONE:PC Mac Linux模型下. UNITY_IPHONE:IOS模式下. UNITY_ANDROID:ANDROID模式下