2016-03-16 77 views
0

兩個文件我使用:使用inotifywait並行處理

inotifywait -m -q -e close_write --format %f . | while IFS= read -r file; do 
cp -p "$file" /path/to/other/directory 
done 

監視文件下載完成的文件夾,然後將其移動到另一個文件夾。

文件是成對的,但在不同的時間,即File1_001.txt在3pm製作,File1_002.txt在9pm製作。我想監視兩個文件的完成情況,然後啓動一個腳本。

script.sh File1_001.txt File1_002.txt 

所以我需要另一個inotifywait命令或不同的工具,也可以識別這兩個文件是當前和完成,然後啓動腳本。

有誰知道如何解決這個問題?

+1

我不太瞭解你的要求或你的挑戰是什麼;在我看來,你可以啓動你的等待循環兩次,每個文件一次。也就是說,[這個答案](http://stackoverflow.com/a/10958125/1072112)可能會爲您提供一種替代策略。請注意,對於您的問題中帶有腳本摘錄的答案*和*,如果文件名包含空格,換行符或其他控制字符等非標準字符,則可能會遇到問題。 – ghoti

+0

@ghoti說了些什麼;你的要求是模糊的。 – tink

+0

@ ghoti謝謝,我已經更新了我的問題,嘗試更清楚。我需要等待兩個由分隔符分隔的文件關閉,然後將這兩個文件名傳遞給一個新腳本。意思是,即使File2_001.txt在File1_002.txt之前完成,也應該傳遞File1_001.txt和File1_002.txt。 –

回答

0

我發現一個安裝有inotifywait的Linux機器,所以現在我明白它的作用和工作原理。 :)

這是你所需要的?

#!/bin/bash 

if [ "$1" = "-v" ]; then 
     Verbose=true 
     shift 
else 
     Verbose=false 
fi 

file1="$1" 
file2="$2" 

$Verbose && printf 'Waiting for %s and %s.\n' "$file1" "$file2" 

got1=false 
got2=false 
while read thisfile; do 
     $Verbose && printf ">> $thisfile" 
     case "$thisfile" in 
       $file1) got1=true; $Verbose && printf "... it's a match!" ;; 
       $file2) got2=true; $Verbose && printf "... it's a match!" ;; 
     esac 
     $Verbose && printf '\n' 
     if $got1 && $got2; then 
       $Verbose && printf 'Saw both files.\n' 
       break 
     fi 
done < <(inotifywait -m -q -e close_write --format %f .) 

此運行的單個inotifywait但解析在離開時在命令行($1$2)上兩個文件被視爲已經被更新的循環其輸出。

請注意,如果一個文件關閉,然後在第二個文件關閉時重新打開,則此腳本顯然不會檢測到打開的文件。但是在你的用例中這可能不是一個問題。

請注意,有很多方法可以構建解決方案 - 我僅向您展示了一個解決方案。