1. 程式人生 > >每日一道shell 練習(05)——批量打包文件

每日一道shell 練習(05)——批量打包文件

find xargs tar

1. 習題

找到 /123 目錄下所有後綴名為 .txt 的文件

  • 批量修改.txt 為 .txt.bak
  • 把所有.bak 文件打包壓縮為 123.tar.gz
  • 批量還原文件的名字,即把增加的.bak 再刪除

2. 習題分析

  1. 首先要想辦法找出 .txt 結尾的文件,用 find 命令。
  2. 打包命令用 tar czvf 就可以搞定了,關鍵是如何同時將所有 .bak 文件打包。
  3. 還原文件名有點復雜,關鍵是如何找到原來的文件名。

3. 具體腳本

在腳本總已經加進了我的分析,可以看看

[root@cenvm71 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 循環的常見用法,關鍵是學習那種處理問題的思路。

?

每日一道shell 練習(05)——批量打包文件