কোনও পসিক্স শি-এন-এ / -টোট পরীক্ষা করা হচ্ছে


11

বিল্ট-ইন testএবং [ইউটিলিটিগুলির বেশিরভাগ শেলগুলিতে -nt("এর চেয়ে নতুন") এবং -ot("এর চেয়ে বড়") পরীক্ষা রয়েছে, এমনকি শেলটি "পসিক্স মোডে" চলমান থাকলেও (একই নামগুলির বহিরাগত ইউটিলিটিগুলির ক্ষেত্রেও সত্য যে সিস্টেমে আমার অ্যাক্সেস রয়েছে)। এই পরীক্ষাগুলি দুটি ফাইলে সংশোধন টাইমস্ট্যাম্পগুলির তুলনা করার জন্য। তাদের নথিভুক্ত শব্দার্থবিজ্ঞানগুলি বাস্তবায়ন জুড়ে কিছুটা আলাদা হয় (এক বা অন্য ফাইলটি উপস্থিত না থাকলে কী ঘটে তার সাথে সম্পর্কিত), তবে তারা পসিক্স স্পকেtest অন্তর্ভুক্ত হয় না জন্য উপযোগ

testকন্ডিশনাল কমান্ড যখন [কর্নশেল] শেল থেকে সরানো হয়েছিল তখন সেগুলি ইউটিলিটিতে অগ্রসর করা হয়নি কারণ সেগুলি testইউটিলিটির historical তিহাসিক বাস্তবায়নে নির্মিত ইউটিলিটিতে অন্তর্ভুক্ত করা হয়নি sh

ধরে নিচ্ছি যে আমি /bin/shশেল স্ক্রিপ্টের ফাইলগুলির মধ্যে সংশোধন টাইমস্ট্যাম্প তুলনা করতে চাই এবং তারপরে একটি ফাইল অন্যটির চেয়ে নতুন নতুন কিনা তার উপর নির্ভর করে ব্যবস্থা গ্রহণ করব

if [ "$sigfile"     -nt "$timestamp" ] ||
   [ "$sigfile.tmp" -nt "$timestamp" ]
then
    return
fi

... আমি বাদে আর কী ইউটিলিটি ব্যবহার করতে পারি make(যা স্ক্রিপ্টের বাকী অংশটিকে কমপক্ষে বলতে অস্বাস্থ্যকর করে তুলবে)? বা আমার কি কেবল ধরে নেওয়া উচিত যে কেউ কখনও "historicalতিহাসিক বাস্তবায়ন" এর উপর স্ক্রিপ্টটি চালাচ্ছেন না sh, বা নির্দিষ্ট শেলের মতো লেখার জন্য পদত্যাগ করবেন bash?


আপনি আমার উত্তরে দেখতে পাচ্ছেন, বাশ এমনভাবে -ntবৈশিষ্ট্যটি কার্যকর করে না testযা প্রত্যাশিত থেকে প্রত্যাশিত। 1995. আপনি সঠিক আচরণ পছন্দ করলেও আপনার findবাসড এক্সপ্রেশনটি ব্যবহার করা উচিত bash
সুন্দরভাবে

উত্তর:


10

POSIXLY:

f1=/path/to/file_1
f2=/path/to/file_2

if [ -n "$(find -L "$f1" -prune -newer "$f2")" ]; then
    printf '%s is newer than %s\n' "$f1" "$f2"
fi

ফাইলের নিখুঁত পাথ ব্যবহার করে ফাইলের নাম সহ একটি মিথ্যা ইতিবাচক প্রতিরোধে কেবলমাত্র নিউলাইন থাকে।

আপেক্ষিক পথ ব্যবহারের ক্ষেত্রে, তারপরে findকমান্ডটি এতে পরিবর্তন করুন:

find -L "$f1" -prune -newer "$f2" -exec echo . \;

টেকনিক্যালি, আমি মনে করি এটি ব্যর্থ হয় যদি $f1কেবল নতুন লাইন থাকে;)
ইলক্কাচু

1
@ ইলক্কাচু এর সাথে কাজ করা যাবে নাকি এরকমই -exec echo x \;?
মুড়ু

@ মুরু, হ্যাঁ -printfযদি এটি মানসম্মত হত তবে সহজ হবে
ilkkachu

3
@ কুসালানান্দ এএএএফসিটি find-র প্রত্যাহারের পৃথক পরীক্ষার চেয়ে পৃথক হওয়া পরিস্থিতি স্বতন্ত্র find- কেবলমাত্র যদি এই পরীক্ষাগুলি চালানোর ক্ষেত্রে কোনও ত্রুটি হয় except findকোনও ফাইল না পাওয়া গেলেও 0 থেকে প্রস্থান করে।
মুড়ু

1
নোট করুন যে আচরণ [ / -nt /nofile ]বাস্তবায়নের সাথে পরিবর্তিত হয় (তবে কখনই কোনও ত্রুটি আউটপুট করে না)।
স্টাফেন চেজেলাস

7

এটি প্রাচীনতম ইউনিক্স কমান্ডগুলির মধ্যে একটি ব্যবহারের ক্ষেত্রে হতে পারে ls

x=$(ls -tdL -- "$a" "$b")
[ "$x" = "$a
$b" ]

ফলাফলটি সত্য যদি কোনও খ এর চেয়েও নতুন হয়।


3
ফাইলের নামগুলি -(নিখোঁজ --) দিয়ে শুরু হলে এটি কাজ করে না । আপনার -Lএটির সমতুল্য হওয়া দরকার -nt। এটি তুলনা xএবং $'x\nx'উদাহরণস্বরূপ কাজ করে না ।
স্টাফেন চেজেলাস

1
ওহো! তবে হু।
কুসালানন্দ

4

আপনি একটি আকর্ষণীয় প্রশ্ন উত্থাপন করেছেন এবং একটি দাবি করেছেন যা প্রথমে যাচাই করা উচিত।

আমি এর আচরণ পরীক্ষা করেছি:

$shell -c '[ Makefile -nt SCCS/s.Makefile ] && echo newer'

বিভিন্ন শাঁস সহ। ফলাফল এখানে:

  • বাশ কাজ করে না - কিছু মুদ্রণ করে না।

  • বোশ কাজ করে

  • ড্যাশ কাজ করে না - কিছু মুদ্রণ করে না।

  • ksh88 কাজ করে না - কিছু মুদ্রণ করে না।

  • ksh93 কাজ করে

  • mksh কাজ করে না - কিছু প্রিন্ট করে না।

  • সর্বোকৃষ্ট কপি করে প্রিন্ট: সর্বোকৃষ্ট: [: -nt: অপ্রত্যাশিত অপারেটর / প্রতীক

  • যশ কাজ করে

  • zsh নতুন সংস্করণে কাজ করে , পুরানো সংস্করণ কিছুই মুদ্রণ করে

সুতরাং নয়টি শেলের মধ্যে চারটি অন- বৈশিষ্ট্যটিকে সমর্থন করে এবং এটি সঠিকভাবে প্রয়োগ করে। এই ক্ষেত্রে সঠিকভাবে এর অর্থ: সাম্প্রতিক প্ল্যাটফর্মগুলিতে টাইম স্ট্যাম্পগুলির তুলনা করতে সক্ষম যা উপ-দ্বিতীয়বারের স্ট্যাম্পের গ্রানুলারিটি সমর্থন করে । মনে রাখবেন যে আমি নির্বাচিত ফাইলগুলি সাধারণত তাদের টাইম স্ট্যাম্পগুলিতে কেবল কয়েকটি মাইক্রোসেকেন্ডে পৃথক হয়।

যেহেতু কাজের findবাস্তবায়ন সন্ধান করা সহজ , তাই আমি প্রতিস্থাপন করার পরামর্শ দিই

if [ "$file1" -nt "$file2" ] ; then
    echo newer
fi

একটি findভিত্তিক প্রকাশ দ্বারা।

if [ "$( find "$file1" -newer "$file2" )" ]; then
    echo newer
fi

কমপক্ষে ততক্ষণ কাজ করে যতক্ষণ $file1না কেবল নিউলাইন থাকে।

if [ "$( find -L "$file1" -newer "$file2" -exec echo newer \; )" ]; then
    echo newer
fi

কিছুটা ধীর হলেও সঠিকভাবে কাজ করে।

বিটিডাব্লু: মেকিং সম্পর্কিত আমি সমস্ত প্রয়োগের জন্য কথা বলতে পারি না, তবে SunPro Makeপ্রায় ন্যানোসেকেন্ড গ্রানুলারিটির সাথে সময়ের তুলনা সমর্থন করি। 20 বছর, যখন smakeএবং gmakeসম্প্রতি এই বৈশিষ্ট্যটি যুক্ত করা হয়েছে।


1
উপ-দ্বিতীয় টাইমস্ট্যাম্পগুলির তুলনা করতে ব্যর্থতার কারণে "কাজ করছে না" পরীক্ষাগুলি কাজ করছে না (অবশ্যই?), বা অন্য কিছু? আপনার পরীক্ষার সাথে জড়িত ফাইলগুলির আসল টাইমস্ট্যাম্পগুলি কী? পরীক্ষার জন্য +1!
কুসালানন্দ

2
আমি মনে করি ডাউনভোটটি সম্ভবত মুখোমুখি শব্দগুলি সম্পর্কে। এখানে, এটিকে সীমাবদ্ধতা বলা (কিছু প্রসঙ্গে উল্লেখযোগ্য) বলা ভাল হবে। findব্যস্তবক্স বা উত্তরাধিকারী-সরঞ্জামচেষ্টার মতো কিছু বাস্তবায়নগুলির ক্ষেত্রে একই সীমাবদ্ধতা থাকবে।
স্টাফেন চেজেলাস

3
আপনি প্রয়োজন চাই -Lজন্য findসংস্করণে সমতুল্য হতে -nt। এছাড়া ফাইলের নাম যে দিয়ে শুরু উপর ব্যর্থ হবে -বা !, (...
Stéphane Chazelas

2
প্রকৃতপক্ষে, আমি যখন দ্বন্দ্বমূলক শব্দ ব্যবহার করি তখন প্রায়শই ডাউনভোটস পাই। আপনি যদি উত্তরটির শুরুতে প্রসঙ্গটি (দ্বিতীয় টাইমস্ট্যাম্পের মধ্যে সংশোধিত ফাইলগুলি দ্বিতীয় রেজোলিউশনে সংক্ষিপ্ত করে) বর্ণিত থাকেন তবে এখানে এটি সহায়তা করবে।
স্টাফেন চেজেলাস

1
@schily, হ্যাঁ, BSD গুলোর findআছে find -f "$file"যে জন্য কিন্তু এটা পোর্টেবল নয়।
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.