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
inotifywait
là chính xác những gì bạn đang tìm kiếm: http://linux.die.net/man/1/inotifywait
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 đó.
#! /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
.
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>
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
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. –
Đầ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ố.
- 1. Run shell script cho mỗi tập tin trong thư mục
- 2. Làm thế nào để bắt đầu một kịch bản shell trong một phút sau trong linux?
- 3. Văn bản tuyệt vời 2 tìm trong thư mục có phần mở rộng tập tin
- 4. Một .bat hoặc .wsh kịch bản mà có thể tìm kiếm cho các tập tin
- 5. làm thế nào để ftp nhiều tập tin bằng cách sử dụng kịch bản shell
- 6. Tìm và thay thế trong kịch bản lệnh shell
- 7. Shell lệnh để tìm tập tin trong một thư mục mẫu
- 8. tạo một thư mục mới và một tập tin văn bản bên trong thư mục đó
- 9. thư viết lại mod nếu tập tin/thư mục không tìm thấy
- 10. Làm thế nào để tạo một hàm trong kịch bản lệnh shell nhận các tham số?
- 11. Làm thế nào để có được các tập tin mới nhất X từ một thư mục trong PHP?
- 12. Powershell Get-ChildItem tập tin mới nhất trong thư mục
- 13. Tìm tập tin trong một thư mục sử dụng Java
- 14. Calling Refresh() trên một DirectoryCatalog ném ChangeRejectedException nếu DLL mới tìm thấy trong thư mục
- 15. Làm thế nào để viết kịch bản lệnh shell để tìm số trang trong PDF?
- 16. emacs - làm thế nào để tìm kiếm tập tin trong thư mục con
- 17. Làm cách nào để tìm tệp trong mỗi thư mục có số lượng tệp cao nhất?
- 18. Làm thế nào để lấy tên của nhánh git hiện tại thành một biến trong một kịch bản lệnh shell?
- 19. Làm thế nào để (thiết bị đầu cuối) cd trong thư mục từ kịch bản ruby
- 20. Làm thế nào để vượt qua một biến trong một lệnh curl trong kịch bản shell
- 21. DOS: tìm một chuỗi, nếu tìm thấy sau đó chạy một kịch bản
- 22. Powershell kịch bản để xóa các tập tin không được xác định trong một danh sách
- 23. Làm thế nào để tải tất cả các tập tin trong một thư mục với XNA?
- 24. Sử dụng find in kịch bản bash - làm thế nào để xử lý trường hợp tìm thấy lợi nhuận "tập tin hoặc thư mục không tồn tại"
- 25. chức năng virtualenvwrapper không có trong kịch bản shell
- 26. Tôi đang cố gắng để tìm tập tin với nhiều phần mở rộng trong một kịch bản shell
- 27. Unix: Làm thế nào để xóa các tập tin được liệt kê trong một tập tin
- 28. Làm cách nào để tìm tập tin đệ quy trong các thư mục
- 29. Làm thế nào để có được một NSArray tên tập tin của tất cả các tập tin trong một thư mục nhất định trong ứng dụng của tôi?
- 30. Làm thế nào để có được một kịch bản Unix để chạy mỗi 15 giây?
Giả sử "unix" có nghĩa là "Linux" tại đây. –
Có nhưng không hoạt động với Windows CIFS được gắn trên Linux. – Meloman