1. 习题
找到 /123 目录下所有后缀名为 .txt 的文件
- 批量修改.txt 为 .txt.bak
- 把所有.bak 文件打包压缩为 123.tar.gz
- 批量还原文件的名字,即把增加的.bak 再删除
2. 习题分析
- 首先要想办法找出 .txt 结尾的文件,用 find 命令。
- 打包命令用 tar czvf 就可以搞定了,关键是如何同时将所有 .bak 文件打包。
- 还原文件名有点复杂,关键是如何找到原来的文件名。
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
【分析】
- 如果只是遍历目录,找出某种文件,然后修改一下文件名,其实一条命令就可以搞定:
find /usr/local/sbin/work -type f -name "*.txt" -print0 | xargs -d ‘\0‘ mv {} {}.bak
要注意,find 命令的查找路径需要使用绝对路径,不要用相对路径。如果用 xargs 命令接在后面,则用 -print0 选项,将某些包含空格的特殊文件名,也包含在内,不会处理错误。
- 脚本中的 while 循环这种方式其实也是很常见的,将结果临时保存在一个文件中,然后再通过while 循环读取处理。
- 大家看到脚本中多次使用 /tmp/file.txt 这个文件了吧。将 .txt 结尾的文件保存到一个文件中,这种办法就恨到地解决了我们在习题分析中提出的第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