2012-11-07 12 views
5

मेरे पास /home/user/local नामक एक निर्देशिका है। हर दो मिनट या तो, इस निर्देशिका में एक नई फाइल डाली जाती है। मुझे यह देखने के लिए हर 2 मिनट में इस निर्देशिका की जांच करनी है कि क्या कोई नई फाइल/फाइलें उतरा हैं। और यदि नई फाइलें हैं, तो मुझे इसे बाद में उपयोग करने के लिए एक चर में एक सूची डालना होगा। मैं यह खोल स्क्रिप्ट कैसे करूं?शैल स्क्रिप्ट में प्रत्येक 2 मिनट निर्देशिका में नई फाइलें कैसे हैं या नहीं?

उत्तर

2

inotifywait आप के लिए क्या देख रहे ठीक है: http://linux.die.net/man/1/inotifywait

+0

मानते हैं कि "यूनिक्स" का अर्थ है "लिनक्स"। –

+0

हां लेकिन विंडोज शेयर सीआईएफएस के साथ काम नहीं कर रहा लिनक्स पर लगाया गया। – Meloman

0

एक क्रॉन जॉब कि एक स्क्रिप्ट है कि वर्तमान सूची लेता है और करने के लिए एक पुराने कहीं एक फ़ाइल में संग्रहीत लिस्टिंग यह तुलना चलाता सेट करें।

4
#! /usr/bin/env bash 

FILELIST=/tmp/filelist 
MONITOR_DIR=/home/usr/local 

[[ -f ${FILELIST} ]] || ls ${MONITOR_DIR} > ${FILELIST} 

while : ; do 
    cur_files=$(ls ${MONITOR_DIR}) 
    diff <(cat ${FILELIST}) <(echo $cur_files) || \ 
     { echo "Alert: ${MONITOR_DIR} changed" ; 
      # Overwrite file list with the new one. 
      echo $cur_files > ${FILELIST} ; 
     } 

    echo "Waiting for changes." 
    sleep $(expr 60 \* 2) 
done 

एक त्वरित & गंदा तरीका है। :) यह परिवर्तनों के लिए निर्देशिका की निगरानी करेगा, न केवल जब नई फ़ाइल डंप हो जाएगी, लेकिन अगर कुछ फ़ाइल गुम/हटा दी गई है।

फ़ाइल सूची परिवर्तनीय $cur_files में संग्रहीत है।

0

चलें कि आपका वेरिएबल कहा जाता है $ listOF

एक स्क्रिप्ट बनाएँ:

listOfFiles=`ls -t /home/user/local` 
for i in $listOfFiles 
do 
echo "$listOF" | grep $i 
if [[ "$?" -eq "0" ]] 
then 
listOF=$listOF" "$i 
fi 
done 

और cmd द्वारा crontab में इस स्क्रिप्ट को:

1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55,57,59 * * * * <path to your script> 
+0

मुझे लगता है कि आप इस तरह की 'crontab' प्रविष्टि लिख सकते हैं: '0-59/2 * * * * <आपकी स्क्रिप्ट के लिए पथ>' – leafei

+0

हां, आप कर सकते हैं, लेकिन कभी-कभी यह काम करता है, कभी-कभी नहीं। :-) वितरण, संस्करण इत्यादि पर निर्भर करता है। –

0
: प्रारूप में crontab -e

लीएफ़ी के लिए सबसे बड़ा धन्यवाद, मुझे आशा थी कि यह इतना आसान था। हालांकि लूप के लिए अस्थायी फ़ाइलों को लिखने के लिए मेरे डिवाइस project के लिए पर्याप्त पोर्टेबल नहीं थे और मुझे निगरानी की गई निर्देशिका में होने वाली विभिन्न चीजों के लिए क्रियाएं करने की आवश्यकता थी, इसलिए यहां लिपि के उत्तर के आधार पर लिखी गई स्क्रिप्ट और स्थानीय रूप से परीक्षण किया गया है। नोट स्वरूपण शायद पहली पोस्ट पर बंद ...

#!/usr/bin/env bash 
Var_monitor_dir="${1?No directory passed}" 
Var_sleep_time="${2:-120}" 
Var_diff_opts="--suppress-common-lines" 
Func_parse_change(){ 
    _added_input="$(grep -E ">" <<<"${@}")" 
    _removed_input="$(grep -E "<" <<<"${@}")" 
    if [ "${#_added_input}" != "0" ]; then 
      mapfile -t _arr_added <<<"${_added_input}" 
      let _added_count=0 
      until [ "${#_arr_removed}" = "${_added_count}" ]; do 
       _current_path="${_arr_removed[${_added_count}]}" 
       if [ -f "${_current_path}" ]; then 
        echo "# ${0##*/} detected added file: ${_current_path}" 
       elif [ -d "${_current_path}" ]; then 
        echo "# ${0##*/} detected added directory ${_current_path}" 
       elif [ -p "${_current_path}" ]; then 
        echo "# ${0##*/} detected added named pipe ${_current_path}" 
       fi 
       ## Ignore other added input and add to index counter 
       let _added_count++ 
      done 
      unset _added_count 
    fi 
    if [ "${#_removed_input}" != "0" ]; then 
      mapfile -t _arr_removed <<<"${_added_input}" 
      let _removal_count=0 
      until [ "${#_arr_removed}" = "${_removal_count}" ]; do 
       echo "# Removal detected: ${_arr_removed[${_removal_count}]}" 
       let _removal_count++ 
      done 
    fi 
} 
Func_watch_dir(){ 
    _current_listing="" 
    while [ -d "${Var_monitor_dir}" ]; then 
     _new_listing="$(ls "${Var_monitor_dir}")" 
     _diff_listing="$(diff ${Var_diff_opts} <(echo "${_current_listing}") <(echo "${_new_listing}"))" 
     if [ "${#_diff_listing}}" != "0" ]; then 
      Func_parse_change "${_diff_listing}" 
     fi 
     _current_listing="${_new_listing}" 
     sleep ${Var_sleep_time} 
    done 
} 
if [ "${#@}" != "0" ]; then 
    Func_watch_dir 
    exit 0 
else 
    echo "${0##*/} needs a directory to monitor" 
    exit 1 
if 

ऊपर monitor_directory.sh रूप में सहेजा जाता मान लें और निर्देशिका निगरानी करने है /tmp तो एक टर्मिनल खोलने और monitor_directory "/tmp" inputting (या monitor_directory.sh "/tmp" "10" परीक्षण के बीच तेजी से अद्यतन करने के लिए) होगा लूप शुरू करें जो परिवर्तनों की जांच करता है। फिर एक दूसरे टर्मिनल के बाद और

mkdir -p /tmp/test_dir 
touch /tmp/test.file 

अद्यतन करने के लिए करने के बाद प्रतीक्षा समय यदि आप चलाने के पहले टर्मिनल, रिपोर्ट करना चाहिए कि एक फाइल और एक निर्देशिका प्रकट हुई है निर्भर है पहले टर्मिनल के लिए इंतज़ार कर डालने का पुनः प्रयास खोलने के बाद और फिर से प्रतीक्षा करें यह हटाने भी दिखाएगा।

rmdir /tmp/test_dir 
rm /tmp/test.file 

उम्मीद है कि इससे कुछ मदद मिलती है।