業(yè)務(wù)需求:定時(shí)從path1中取文件,復(fù)制到path2中
復(fù)制文件腳本
#! /bin/bash
path1="/newhd01/ulog_winup/"
path2="/newhd01/ulog_winup/real_for_flume/"
timelimit1="+6"
timelimit2="-17"
for i in "Search" "Download" "Browse"; do
list_newfiles=`cd $path1$i && find -iname "*.txt" -type f -mmin $timelimit2 -a -mmin $timelimit1 | awk '{print substr($1,3)}'`
echo ""
echo "target folder: $path2${i}1"
echo "Trying to copy those files in $path1$i"
echo "$list_newfiles"
echo ""
OLD_IFS=$IFS
IFS=$'\n'
arr_newfiles=($list_newfiles)
for s in ${arr_newfiles[@]}; do
#echo "$s"
isfindthisfile=`find $path2${i}1 -iname $s`
if [ -z "$isfindthisfile" ]; then
echo "$path1$i/$s is not in target folder,try to copy!"
cp "$path1$i/$s" "$path2${i}1/$s.TMP"
mv "$path2${i}1/$s.TMP" "$path2${i}1/$s"
echo "$path1$i/$s has been moved successfully!!!"
else
echo "$path1$i/$s is allready in target folder,trying to copy next !"
fi
done
done
IFS=$OLD_IFS
主要解釋第7行
list_newfiles=`cd $path1$i && find -iname "*.txt" -type f -mmin $timelimit2 -a -mmin $timelimit1 | awk '{print substr($1,3)}'`
分3部分:
cd $path1$i進(jìn)入源文件夾目錄,其實(shí)可以直接find里面加路徑參數(shù)find -iname "*.txt" -type f -mmin $timelimit2 -a -mmin $timelimit1
深入了解find命令
找出txt格式(-iname "*.txt")的文件(-type f),修改時(shí)間(-mmin)是前timelimit1分鐘 至前 timelimit2分鐘 之間(-a并且)的這段時(shí)間(注意這里時(shí)間的正負(fù)的含義,+表示前幾分鐘之前,-表示前幾分鐘之內(nèi))awk '{print substr($1,3)}'2中獲取的結(jié)果是一列字符串,每一行是“./*.txt”這種形式,利用awk處理這些字符即取第一列($1)取子串第3個(gè)字符及后續(xù)
最終輸出結(jié)果是n行字符('\n'分割)組成的一串字符串(并非n行的列表)
既然上述命令輸出的是一串字符串,則不可避免需要做切割。
對(duì)于一行字符串str="aaa,bbb,vvv,ccc"
直接利用${str[@]}就可以獲得分割后的列表。那么,如何定義分隔符呢?
IFS=$','
IFS是系統(tǒng)自帶的一個(gè)變量,儲(chǔ)存著分隔符,默認(rèn)好像是空格??梢宰远x
上面腳本中就是定義了IFS為換行符。
腳本后半部分就是依次處理文件,判斷目標(biāo)文件夾是否已有該文件,如果沒(méi)有,就復(fù)制。
使用crontab做定時(shí)任務(wù)
項(xiàng)目中源文件夾的文件是每個(gè)幾分鐘會(huì)增加一個(gè),相當(dāng)于上述腳本要每隔一段時(shí)間運(yùn)行一次,以確保源文件夾和目標(biāo)文件夾里的內(nèi)容同步。
crontab講解1
crontab講解2