inotifywait
अब तक दिए गए कुछ- आधारित दृष्टिकोणों के साथ कुछ समस्याएं हैं:
- वे एक
sleep.txt
फ़ाइल खोजने में विफल रहते हैं जिसे पहले अस्थायी नाम के रूप में बनाया गया है और फिर नाम बदल दिया गया है sleep.txt
। एक के moved_to
अलावा घटनाओं के लिए मैच की जरूरत हैcreate
- फाइल के नाम में न्यूलाइन कैरेक्टर हो सकते हैं, न्यूलाइन सीमांकित फाइलों के नाम प्रिंट करना यह निर्धारित करने के लिए पर्याप्त नहीं है कि क्या
sleep.txt
बनाया गया है। क्या होगा अगर एक foo\nsleep.txt\nbar
फ़ाइल उदाहरण के लिए बनाई गई है?
- क्या होगा यदि फ़ाइल शुरू होने से पहले बनाई गई है
inotifywait
और घड़ी स्थापित की गई है? फिर inotifywait
पहले से ही यहां मौजूद एक फाइल के लिए हमेशा के लिए इंतजार करना होगा। आपको यह सुनिश्चित करने की आवश्यकता होगी कि घड़ी स्थापित होने के बाद फ़ाइल पहले से ही वहां नहीं है।
- कुछ समाधान
inotifywait
चल रहे हैं (कम से कम जब तक एक और फ़ाइल नहीं बनाई जाती है) फ़ाइल मिलने के बाद।
उन लोगों को संबोधित करने के लिए, आप कर सकते हैं:
sh -c 'echo "$$" &&
LC_ALL=C exec inotifywait -me create,moved_to --format=/%f/ . 2>&1' | {
IFS= read pid &&
while IFS= read -r line && [ "$line" != "Watches established." ]; do
: wait for watches to be established
done
[ -e sleep.txt ] || [ -L sleep.txt ] || grep -qxF /sleep.txt/ && kill "$pid"
}
ध्यान दें कि हम sleep.txt
वर्तमान निर्देशिका में निर्माण के लिए देख रहे हैं , .
(इसलिए आप cd /tmp || exit
अपने उदाहरण से पहले ऐसा करेंगे )। वर्तमान निर्देशिका कभी नहीं बदलती है, इसलिए जब वह पाइप लाइन सफलतापूर्वक लौटती है, तो यह sleep.txt
वर्तमान निर्देशिका में है जो बनाई गई है।
बेशक, आप बदल सकते हैं .
के साथ /tmp
ऊपर है, लेकिन, जबकि inotifywait
चल रहा है, /tmp
कई बार नाम बदला जा सकता था (के लिए की संभावना नहीं /tmp
है, लेकिन सामान्य मामले में विचार करने के लिए कुछ) या एक नया फाइल सिस्टम उस पर घुड़सवार, इसलिए जब पाइप लाइन रिटर्न, यह नहीं हो सकता एक है /tmp/sleep.txt
कि बनाया गया है, लेकिन /new-name-for-the-original-tmp/sleep.txt
इसके बजाय। /tmp
अंतराल में एक नई निर्देशिका भी बनाई जा सकती थी और उस पर किसी की नजर नहीं जाती थी, इसलिए sleep.txt
बनाए गए का पता नहीं चलता।
$MAILPATH
।