2012-11-07 22 views
5

Tôi có một thư mục có tên /home/user/local. Cứ hai phút một lần, một tập tin mới sẽ được đưa vào thư mục này. Tôi cần phải kiểm tra thư mục này mỗi 2 phút để xem một tập tin/tập tin mới đã hạ cánh trong đó. Và nếu có các tập tin mới, tôi cần phải đưa một danh sách của nó vào một biến để sử dụng sau này. Làm thế nào để làm kịch bản shell này?Làm thế nào để tìm thấy nếu có các tập tin mới trong một thư mục mỗi 2 phút trong kịch bản shell?

Trả lời

2

inotifywait là chính xác những gì bạn đang tìm kiếm: http://linux.die.net/man/1/inotifywait

+0

Giả sử "unix" có nghĩa là "Linux" tại đây. –

+0

Có nhưng không hoạt động với Windows CIFS được gắn trên Linux. – Meloman

0

Thiết lập một công việc định kỳ chạy một kịch bản mà sẽ đưa danh sách hiện tại và so sánh nó với một già trên danh sách của lưu trữ trong một tập tin ở đâu đó.

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 

nhanh chóng & cách bẩn. :) Nó sẽ theo dõi thư mục để thay đổi, không chỉ khi có tệp mới được đổ vào, mà còn nếu một số tệp bị thiếu/bị xóa.

Danh sách tệp được lưu trữ trong biến $cur_files.

0

phép nói rằng biến của bạn được gọi là $ listOF

Tạo một kịch bản:

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

Và đưa kịch bản này vào crontab bởi cmd: crontab -e ở định dạng:

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

Tôi nghĩ bạn có thể viết mục 'crontab' như sau:' 0-59/2 * * * * <đường dẫn đến tập lệnh của bạn> ' – leafei

+0

Có, bạn có thể, nhưng đôi khi nó hoạt động, đôi khi không. :-) Tùy thuộc vào phân phối, phiên bản, v.v. –

0

Đầu tiên cảm ơn bạn rất nhiều, tôi hy vọng điều đó thật dễ dàng. Tuy nhiên đối với các thiết bị của tôi viết các tệp tạm thời cho các vòng lặp không đủ di động cho project hiện tại của tôi và tôi yêu cầu thực hiện các hành động cho nhiều thứ có thể xảy ra trong một thư mục được giám sát, vì vậy đây là kịch bản tôi viết dựa trên câu trả lời của leafei và được thử nghiệm cục bộ. Lưu ý định dạng có thể tắt về bài đăng đầu tiên ...

#!/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 

Giả sử trên được lưu lại dưới dạng monitor_directory.sh và thư mục được giám sát được /tmp sau đó mở một terminal và nhập monitor_directory "/tmp" (hoặc monitor_directory.sh "/tmp" "10" để có thông tin cập nhật nhanh hơn giữa các xét nghiệm) sẽ bắt đầu vòng lặp kiểm tra các thay đổi. Sau đó mở một terminal thứ hai thử nhập sau và chờ đợi nhà ga đầu tiên để cập nhật

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

Sau thời gian chờ đợi là lên nhà ga đầu tiên nên báo cáo rằng một tập tin và thư mục đã xuất hiện, nếu bạn chạy sau và chờ một lần nữa nó cũng sẽ hiển thị xóa.

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

Hy vọng điều này sẽ giúp một số.

Các vấn đề liên quan