নির্দিষ্ট এক্সটেনশনের ফাইল তৈরির জন্য ডিরেক্টরি দেখতে কীভাবে ইনোটাইফয়েট ব্যবহার করবেন


21

আমি এই উত্তরটি দেখেছি ।

উদাহরণস্বরূপ আপনার ইনোটাইফাইট ব্যবহার বিবেচনা করা উচিত:

inotifywait -m /path -e create -e moved_to |
    while read path action file; do
        echo "The file '$file' appeared in directory '$path' via '$action'"
        # do something with the file
    done

আমার প্রশ্নটি হ'ল উপরের স্ক্রিপ্টটি যে কোনও ধরণের ফাইল তৈরির জন্য ডিরেক্টরি দেখায়, তবে আমি inotifywaitনির্দিষ্ট কমান্ড / এক্সটেনশনের একটি ফাইল তৈরি হলে (বা ডিরেক্টরিতে স্থানান্তরিত) কেবল তখনই প্রতিবেদন করার আদেশটি কীভাবে পরিবর্তন করব - উদাহরণস্বরূপ এটি হওয়া উচিত কোন .xmlফাইল তৈরি করা হয় যখন রিপোর্ট ।

আমি যা চেষ্টা করেছি:

আমি inotifywait --helpকমান্ডটি চালিয়েছি এবং কমান্ড লাইন অপশনগুলি পড়েছি। এটা আছে --exclude <pattern>এবং --excludei <pattern>কমান্ড বহির্ভূত (Regex ব্যবহার করে) নির্দিষ্ট প্রকারের ফাইলগুলি, কিন্তু আমি একটি উপায় প্রয়োজন শুধু অন্তর্ভুক্ত একটি নির্দিষ্ট প্রকার / এক্সটেনশন ফাইল।


বিটিডাব্লু, pathউপরের ব্যবহারটি সম্ভবত সেরা শ্যাওলারের সাথে নাম ব্যবহার করা উচিত নয়। আপনি যদি এটি ব্যবহার করেন তবে আপনি কমান্ড এবং সমস্ত কিছু ব্যবহার করতে পারবেন না যেহেতু এটি মূলত কেবলমাত্র স্ট্যান্ডার্ডকে ছাড়িয়েছে PATH। সুতরাং আমি fpathপরিবর্তে মত একটি বিকল্প বর্ণ নাম ব্যবহার করার পরামর্শ দিচ্ছি । অর্থাত্ while read fpath action fileআপনার শেল থেকে সাধারণত পাওয়া যায় এমন কোনও মানক কমান্ড এখনও থাকবে।
ব্যাপটিস্ট ম্যাথুস

এটি একটি হাস্যকর বিষয় যে কোনও বিকল্প অন্তর্ভুক্ত নয়।
ইরানড্রোস

উত্তর:


17

যখন নির্দিষ্ট ধরণের / এক্সটেনশনের একটি ফাইল তৈরি হয় কেবল তখনই আমি কীভাবে ইনোটিফাইয়েট আদেশটি পরিবর্তন করতে পারি?

অনুগ্রহ করে নোট করুন যে এটি এখনই আমার কাছে অ্যাক্সেস নেই বলে এইটি অন্টিস্টেড কোডinotify । তবে এর অনুরূপ কিছু কাজ করা উচিত:

inotifywait -m /path -e create -e moved_to |
    while read path action file; do
        if [[ "$file" =~ .*xml$ ]]; then # Does the file end with .xml?
            echo "xml file" # If so, do your thing here!
        fi
    done

2
এটি কাজ করে এবং আমি ইনোটিফয়েট দিয়ে এটি পরীক্ষা করেছি।
দ্য বেটারজর্ট

1
আপনি কিভাবে এটি চালান? এটি কি এককালীন কমান্ড, বা এটির কোনও লুপে চালানো বা এরকম কিছু দরকার আছে? সম্ভবত অংশ হিসাবে incron(আমি আশা করি না)।
এসডসোলার

@ এসডসোলার এটি পরিবর্তিত হয়। আমার জন্য, আমি সাধারণত চালানোর inotifyসঙ্গে পারেন nohupবা একটি কাস্টম systemd হল সেবা দিয়ে শুরু। বেশিরভাগ ক্ষেত্রেই উত্তরোত্তর।
মোলিংলাভস

9

একটি ডাবল নেতিবাচক ব্যবহার করুন:

inotifywait -m --exclude "[^j][^s]$" /path -e create -e moved_to |
    while read path action file; do
        echo "The file '$file' appeared in directory '$path' via '$action'"
    done

এর মধ্যে কেবল জাভাস্ক্রিপ্ট ফাইল অন্তর্ভুক্ত থাকবে


1
ভাল লাগল, আমি এটি পছন্দ করি যে এটি inotifywaitসমস্ত ফাইলের জন্য বিশাল আউটপুট তৈরি করে তারপরে ফিল্টারিংকে বদলে দেয় এবং পরে ফিল্টার করে (অন্য উত্তরের মতো)। চেষ্টা করা হয়নি, তবে আমি অনুমান করি যে এটি কিছুটা দ্রুত সম্পাদন করবে।
টিএমজি

এটিই আমি খুঁজছিলাম। ফাইলগুলি --excludeদেখার জন্য কীভাবে ইনপুট পরিবর্তন করতে হয় .ext। এটি শুধুমাত্র একবারে বা লুপের জন্য চালানো হয়?
কুরোকিরসমা

এটি একটি ডেমন, সুতরাং এটি ক্র্যাশ না হওয়া বা আপনি এটি বন্ধ না করা পর্যন্ত চলবে :)
জোনাস ইরেনডেল

দুঃখিত, প্রথম প্রশ্ন মিস। inotifywait -m --exclude "[^.][^e][^x][^t]$" /home/jonas/Skrivbord/test -e create -e moved_to | while read path action file; do echo "The file '$file' appeared in directory '$path' via '$action'" done আমি নিশ্চিত রেইজেক্সটি অনুকূলিত হতে পারে তবে এই শিশুটি কাজ করে :)
জোনাস ইরেনডেল

Thanxs !! আমি চেষ্টা করে দেখব !!
কুরোকিরসমা

3

পূর্ববর্তী উত্তরের দ্বৈত-নেতিবাচক পদ্ধতির একটি দুর্দান্ত ধারণা হওয়ায় (টিএমজি হিসাবে উল্লেখ করা হয়েছে) এটি ফিল্টারিংয়ের কাজটি সত্যই বদলে দেয় inotifywait, এটি সঠিক নয়।

উদাহরণস্বরূপ, যদি কোনও ফাইল শেষ হয় as তবে এটি মিলবে না [^j][^s]$কারণ চূড়ান্ত বর্ণটি sমেলে না [^s], সুতরাং এটি বাদ দেওয়া হবে না।

বুলিয়ান ভাষায়, যদি Sবিবৃতিটি থাকে:

"চূড়ান্ত চিঠি হয় s "

এবং J বিবৃতিটি হ'ল:

"পেনাল্টিমেট চিঠিটি হ'ল j "

তারপরে --excludeপ্যারামিটারের মানটি অর্থহীনভাবে সমান হওয়া উচিত not(J and S), যা দ্বারা ডি মরগান আইন হয় not(J) or not(S)

আরেকটি সম্ভাব্য সমস্যা হল রয়েছে zsh, $pathএকটি বিল্ট-ইন পরিবর্তনশীল অ্যারে সমতুল্য প্রতিনিধিত্বমূলক$PATH , তাই while read path ...লাইন সম্পূর্ণরূপে জগাখিচুড়ি আপ হবে $PATHএবং কারণ সবকিছু শেল থেকে unexecutable পরিণত হয়।

সুতরাং সঠিক পন্থাটি হ'ল:

inotifywait -m --exclude "[^j].$|[^s]$" /path -e create -e moved_to |
    while read dir action file; do
        echo "The file '$file' appeared in directory '$dir' via '$action'"
    done

ম্যাচটি পেনাল্টিমেট পজিশনে প্রয়োগ করা হয়েছে কিনা তা নিশ্চিত করার জন্য .যা প্রয়োজন তা নোট করুন [^j]এবং |চরিত্রটি (উপরে উল্লিখিত বুলিয়ান বা প্রতিনিধিত্বকারী) এড়াতে হবে না কারণ --excludeপসিক্স বর্ধিত নিয়মিত এক্সপ্রেশন নেয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.