मेरे पास /home/user/local
नामक एक निर्देशिका है। हर दो मिनट या तो, इस निर्देशिका में एक नई फाइल डाली जाती है। मुझे यह देखने के लिए हर 2 मिनट में इस निर्देशिका की जांच करनी है कि क्या कोई नई फाइल/फाइलें उतरा हैं। और यदि नई फाइलें हैं, तो मुझे इसे बाद में उपयोग करने के लिए एक चर में एक सूची डालना होगा। मैं यह खोल स्क्रिप्ट कैसे करूं?शैल स्क्रिप्ट में प्रत्येक 2 मिनट निर्देशिका में नई फाइलें कैसे हैं या नहीं?
उत्तर
inotifywait
आप के लिए क्या देख रहे ठीक है: http://linux.die.net/man/1/inotifywait
एक क्रॉन जॉब कि एक स्क्रिप्ट है कि वर्तमान सूची लेता है और करने के लिए एक पुराने कहीं एक फ़ाइल में संग्रहीत लिस्टिंग यह तुलना चलाता सेट करें।
#! /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
में संग्रहीत है।
चलें कि आपका वेरिएबल कहा जाता है $ 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>
मुझे लगता है कि आप इस तरह की 'crontab' प्रविष्टि लिख सकते हैं: '0-59/2 * * * * <आपकी स्क्रिप्ट के लिए पथ>' – leafei
हां, आप कर सकते हैं, लेकिन कभी-कभी यह काम करता है, कभी-कभी नहीं। :-) वितरण, संस्करण इत्यादि पर निर्भर करता है। –
लीएफ़ी के लिए सबसे बड़ा धन्यवाद, मुझे आशा थी कि यह इतना आसान था। हालांकि लूप के लिए अस्थायी फ़ाइलों को लिखने के लिए मेरे डिवाइस 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
उम्मीद है कि इससे कुछ मदद मिलती है।
मानते हैं कि "यूनिक्स" का अर्थ है "लिनक्स"। –
हां लेकिन विंडोज शेयर सीआईएफएस के साथ काम नहीं कर रहा लिनक्स पर लगाया गया। – Meloman