Re: [問題] 複製多個檔案
※ 引述《zchien (小建)》之銘言:
: 請教..如果我有很多資料夾...分別要複製到不同目的地
: 因為檔案數量太多...因為我系統沒有rsync...如果不使用rsync
: 如果我只希望複製新增加的資料....我是否有機會使用find 指令..建立清單之後...
: 使用跑回圈的方式...依序丟到指定的不同資料夾.....
因為不是非常清楚你說的需求,所以,
我先假定你 "新增加資料" 的資料夾,與想要複製過去的 "不同" 目的地,
有一對一的對應關係...
建立一個路徑參考檔 path.lst,如下:
source1:destination1
source2:destination2
source3:destination3
以上檔案中,將所有來源目錄與目的目錄,分別用擔一行寫好,
其之間用 ":" 作分隔,要注意 ":" 前後沒有空白,
最後檔案尾端要有一行新行 (new line)。
然後作一個 script 檔名為 cpr:
#!/bin/bash
ReferenceFile=ReferenceFile.rf
if [ ! -e $ReferenceFile ]; then
touch $ReferenceFile
exit
fi
cat $1 |
while read line; do
SourcePath=`echo $line | cut --delimiter=":" --fields=1`
DestinationPath=`echo $line | cut --delimiter=":" --fields=2`
find $SourcePath -newer $ReferenceFile -exec cp -av {} $DestinationPath \;
done
touch $ReferenceFile
這個 script 的關鍵是:
他會檢查一個參考檔是否存在,也就是 "ReferenceFile.rf",不存在會自己建立。
這個 script 第一次執行時,會建立這個檔案,然後什麼也不做的離開,
但是這個檔案的建立日期時間,將被用來作為檢查你所謂 "新資料"。
~$ ./cpr
換句話說,自從第一次執行後,在你來源路徑中所累積的 "新資料",
將會被後面的 find 找到,然後更進一步被複製到你所指定的目的地去。
並且每次複製之後,會更新一次參考檔的檔案日期時間,
用來檢查下一次累積的 "新資料"。
所以爾後,你只要想進行複製最新資料:
~$ ./cpr path.lst
這樣看看是否符合你的需求,不行的話,再拿去按自己的喜好修改吧。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 123.240.167.99
※ 編輯: SeamusBerloz 來自: 123.240.167.99 (08/24 05:04)
推
08/24 09:22, , 1F
08/24 09:22, 1F
推
08/24 18:11, , 2F
08/24 18:11, 2F
→
08/24 18:12, , 3F
08/24 18:12, 3F
→
08/24 18:15, , 4F
08/24 18:15, 4F
→
08/24 18:16, , 5F
08/24 18:16, 5F
→
08/24 18:17, , 6F
08/24 18:17, 6F
→
08/24 18:18, , 7F
08/24 18:18, 7F
其實,只要知道來源路徑與目的路徑之間的關係,或者邏輯能推導出來
就應該不是問題,省去手動建立清單的困擾。
我仔細看了幾遍你的貼文,你好像沒說複製來的檔案在 /home/backup 下要怎樣擺放,
所以這裡我還是假定,按照你原來在 /home/test... 中的原始樹狀結構去擺放啦~
好好培養自己分解問題,是成功的關鍵。依照你的想法思路,程式結構將是:
Step1.使用 find 自動建立清單,但務必加以整形,才方便迴圈敘述繼續接手處理。
Step2.迴圈敘述處理所建立的清單項目(其實就是依序處理每一個檔案的完整路徑)。
Step3.分解路徑字串,擷取路徑位置,準備用來建立目的地資料夾。
Step4.如果目的地資料夾不存在,就建立,已經存在就跳過。
Step5.實際的檔案複製 (擺放到 Step4. 建立的資料夾去),
Step6.重複 Step3. 到 Step5. 直到清單結束。
後面你又提到,test 和 backup 其實都是變數,我不是很懂什麼意思,
也許你想要自己隨定義變動這些以 /home/test... 和 /home/backup 的路徑,
所以,何不就乾脆,想搞哪個資料夾、就搞哪個資料夾...
<< 檔案 cpr2 >>
#!/bin/bash
# 建立檔案清單,靠 awk 整形
FullPathFileList=`find $2/* -mtime $1 | awk '{ printf($1" ") }'`
# 運作迴圈
for FullPathFile in $FullPathFileList; do
# 分解字串,獲得檔案所在路徑
PathName=${FullPathFile%\/*}
# 持續分解,消除來源路徑部份路徑段
PathName=${PathName#$2}
# 拼湊目的路徑 (資料夾)
DestinatiionDirectory=$3$PathName
# 如果目的路徑資料夾本來就不存在,建立之
if [ ! -e $DestinatiionDirectory ]; then
echo Make directory: [$DestinatiionDirectory]
mkdir -p $DestinatiionDirectory
fi
# 實際的複製動作
echo Copy file: [$FullPathFile]
cp -a $FullPathFile $DestinatiionDirectory
done
# 檔案結束
然後:
~$ cpr2 <find 的 mtime 時間參數> <來源路徑> <目的路徑>
~$ cpr2 -1 /home/test /home/backup
再次真心強力建議,若真的覺得不好用,有問題,那就進一步去修改他,
若真的好用,也不要放著光用,去對照、去查書、去知道為什麼要這樣寫,
讓他去符合自己將來更多地方應用的場合,多多參考,寫出好東西是很容易的。
※ 編輯: SeamusBerloz 來自: 123.240.167.99 (08/25 03:52)
推
08/28 00:01, , 8F
08/28 00:01, 8F
討論串 (同標題文章)