2015-11-03 89 views
1

我有以下腳本,它使用inotify來檢測文件夾內的更改。如您所見,我將整個路徑加上變量VAR下的潛在新文件的名稱。 VAR將會像我在評論中的字符串一樣。當我從另一個文件夾粘貼東西時,一切正常,但是當通過rsync將文件傳輸到那裏時,那麼VAR就像這樣/ is/the/path/.filename.log.JgHKzP這意味着在文件名和.XXXXXX添加在它的後面。例如,我得到這個通過rsync通過inotify識別錯誤的文件名

/home/user/CarMonitor/logs/gps/.gps-2015-11-3-18-7-41.log.QvPgm9 

我的意思是我可以做一些字符串更改,使其正確,但爲什麼會發生這種情況?提前致謝。

#!/bin/bash 
inotifywait -r -m /home/user/CarMonitor/logs -e create |  #Wait till new files arrive (Flags: -m for 'monitor', -e for 'event') 
while read path action file; do 
    #echo "The file '$file' appeared in directory '$path' via '$action'"  
    VAR=$path$file 
    #VAR="asddas/sd/f/sda/gps/sdfsdfsdfsd.log" 
    echo $VAR            
    //Do stuff 
done 

回答

1

你所看到的是一種常見的編程技術。它通常用於程序將用新內容替換現有文件。

假設您有一個名爲foo的文件,您想用新版本替換。您可以打開foo進行寫入,這會截斷文件,然後將新內容寫入文件。但是,假設你的程序崩潰或者沒有完成。您再也沒有foo的好副本 - 舊版本不見了,新版本是空的或不完整的。

相反,你的程序步驟如下:

  1. 打開一個不同名稱的文件,說.foo.tmp
  2. 將新內容寫入這個新文件。
  3. 完成後,將.foo.tmp重命名爲foo

現在,如果你的程序未能完成,那麼它會留下一個臨時文件.foo.tmp。但原始文件仍然存在,所以沒有丟失。

Rsync默認使用這種技術來更新文件。你的腳本訂閱創建事件,所以你看到了臨時文件的創建。如果您要訂閱移動事件,您可能會看到正在重命名的文件具有正確的名稱。

Rsync有一些選項來控制這種行爲。 See the man page here並搜索「--inplace」和「--partial」。

+0

謝謝Kenster爲您詳細解答。正是我需要的。 –