কেন কখনও কখনও তার কমান্ড লাইন পাথ আর্গুমেন্টের সাথে মিল পাওয়া যায়?


9

লিনাক্সে,

cd /tmp
mkdir foo; cd foo

এখন, চলছে

find . -name 'foo'

কোন আউটপুট দেয় না। যেখানে চলছে

find /tmp/foo -name 'foo'

আউটপুট দেয় /tmp/fooযা আমার কাছে বোঝায় না। কেউ ব্যাখ্যা করতে পারেন কেন?


2
এটি বর্ণিত হিসাবে অন্তর্ভুক্ত প্রদত্ত পথটির অভ্যন্তরে সমুদ্র সৈকত সন্ধান করুন। সুতরাং আপনি যদি ইনপুটটি ./মেলে নাfoo
কাস্টাস

@ কাস্টাস: আমি তা বুঝতে পেরেছি। আমি যা বুঝতে পারি না তা হ'ল আমি যদি এর জন্য নিখুঁত পথ দিই তবে কেন এটি একটি পার্থক্য করেছে find
ইয়র্ক

@ ইয়র্ক নির্দিষ্ট পরিস্থিতিতে এমন আচরণ নেই যা সর্বদা সঠিক। নামের সাথে একটি সিমলিংক কল্পনা barকরুন fooযা অনুসন্ধানের পথের বাইরে থাকা কোনও ফাইলকে নির্দেশ করে । মিলবে নাকি?
হউক লেগেইন

1
.এবং /tmp/fooএকই হয় না - তারা একই নির্দেশিকাতে দুটি ভিন্ন হার্ড সংযোগগুলি আছে; find /tmp/foo/. -name 'foo'কোন কিছুই খুঁজে পায় না।
জিম্মিজ

@ জিম্মিজ: আমি যখন দৌড়াব, তখন আমি ডিরেক্টরিতে বাশকে find /tmp/foo -name 'foo'জিজ্ঞাসা করছিলাম /tmp/foo, একটি ফাইল যার নাম "ফু"। ডিরেক্টরিটি /tmp/fooখালি থাকার কারণে এটি কিছু না দিয়ে ফিরে আসা উচিত ছিল। আমি কেন বুঝতে পারছি না /tmp/foo। অন্যদিকে find . -name 'foo', আমি যখন দৌড়াচ্ছি তখন আমি বাশকে একই জিনিসটি জিজ্ঞাসা করছিলাম, অর্থাত্ বর্তমান ডিরেক্টরিতে (যা ঘটেছে /tmp/foo) একটি ফাইল সন্ধান করছিলাম , যার নাম 'ফু', এবং এটি কোনও কিছুই ফেরায় না যা সংবেদন করে।
ইয়র্ক

উত্তর:


15

findনির্দিষ্ট ডিরেক্টরি ট্রি (গুলি) কে আবিষ্কার করে এবং এটি খুঁজে পাওয়া প্রতিটি ফাইলের জন্য প্রদত্ত অভিব্যক্তিটিকে মূল্যায়ন করে। ট্র্যাভারসাল প্রদত্ত পথে শুরু হয়। কীভাবে find . -name fooপরিচালিত হয় তার একটি সংক্ষিপ্তসার এখানে :

  • কমান্ড লাইনের প্রথম পথ: .
    • বেস নাম ( .) প্যাটার্ন মেলে foo? না, তাই কিছু করবেন না।
      এটি /tmp/fooহ'ল একই ডিরেক্টরিটির অন্য নাম। তবে findএটি জানেন না (এবং এটি অনুসন্ধানের চেষ্টা করার কথা নয়)।
    • পথটি কি একটি ডিরেক্টরি? হ্যাঁ, সুতরাং এটি অতিক্রম করুন। এন্ট্রিগুলি গণনা করুন .এবং প্রতিটি প্রবেশের জন্য ট্র্যাভারসাল প্রক্রিয়াটি সম্পাদন করুন।
      • ডিরেক্টরি খালি: এটা ছাড়া অন্য কোন এন্ট্রি রয়েছে .এবং ..যা findযাও recursively তর্ক নেই। কাজেই কাজ শেষ।

এবং find /tmp/foo:

  • কমান্ড লাইনের প্রথম পথ: /tmp/foo
    • বেস নাম ( foo) প্যাটার্ন মেলে foo? হ্যাঁ, তাই শর্তটি মেলে।
      • এই শর্তের সাথে কোনও ক্রিয়া জড়িত নেই, তাই ডিফল্ট ক্রিয়াটি সম্পাদন করুন যা পাথ মুদ্রণ করা।
    • পথটি কি একটি ডিরেক্টরি? হ্যাঁ, সুতরাং এটি অতিক্রম করুন। এন্ট্রিগুলি গণনা করুন /tmp/fooএবং প্রতিটি প্রবেশের জন্য ট্র্যাভারসাল প্রক্রিয়াটি সম্পাদন করুন।
      • ডিরেক্টরি খালি: এটা ছাড়া অন্য কোন এন্ট্রি রয়েছে .এবং ..যা findযাও recursively তর্ক নেই। কাজেই কাজ শেষ।

এটি হ'ল এটি একই ডিরেক্টরি .এবং এটি উভয়ের ক্ষেত্রে একই আচরণের /tmp/fooগ্যারান্টি দেওয়ার পক্ষে যথেষ্ট নয় findfindকমান্ড একই ফাইলে পাথ মধ্যে পার্থক্য করার উপায় আছে; -nameসম্পৃক্ত তাদের একজন। find /tmp/foo -name fooপ্রারম্ভিক ডিরেক্টরিটি এবং যাহা বলা হয় তার নীচে যে কোনও ফাইলের সাথে মেলে foofind . -name .কেবলমাত্র সূচনা ডিরেক্টরিটির সাথে মেলে ( .পুনরাবৃত্তির ট্র্যাভারসাল চলাকালীন কখনই খুঁজে পাওয়া যাবে না)।


"এটিতে .. এবং .. ছাড়া আর কোনও প্রবেশ নেই, যা সন্ধান করে পুনরাবৃত্তি করে না" " আমি ধরে নিয়েছি "পুনরাবৃত্তভাবে" "" "" কে উল্লেখ করুন "" যদি এটি সঠিক হয়, তবে ".." এর প্রসঙ্গে "পুনরাবৃত্তির" অর্থ কী হবে?
ফাহিম মিঠা

@FaheemMitha "নয় ঢুকা যাও recursively নেই" উভয় ক্ষেত্রে প্রযোজ্য .এবং ..। (যদি পুনরাবৃত্তভাবে findট্র্যাভারসড করা হয় ., তবে এটি ডিরেক্টরিটি বারবার এবং বারবার এবং…) এর মধ্যে দিয়ে শেষ হবে .এবং ..কেবলমাত্র বিশেষ চিহ্ন নয়, তারা ডিরেক্টরি এন্ট্রি হিসাবে উপস্থিত হয়।
গিলস 'তাই খারাপ হওয়া বন্ধ করুন'

5

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

cd /tmp
mkdir foo
ln -s foo bar
find /tmp/foo -name foo
find /tmp/bar -name foo

"আপনার ক্ষেত্রে" উভয় কল একই ফলাফল দেয় যা বিভ্রান্তিকর হতে পারে। আপনি -mindepth 1যদি প্রাথমিক পয়েন্টগুলি উপেক্ষা করতে চান তবে আপনি ব্যবহার করতে পারেন (পজিক্সহীন হতে পারে)।


-mindepth 1কাজ করে। যাইহোক, আমি এখনো বুঝতে পারি না কেন find . -name 'foo'এবং find /tmp/foo -name 'foo'ভিন্নভাবে আচরণ।
ইয়র্ক

2

(gnu) সন্ধান করে কমান্ডের প্রদত্ত পাথের মধ্যে পাওয়া কোন মিল খুঁজে পাওয়া যায় কারণ এটি কমান্ডলাইন আর্গুমেন্টের সাথে তার তুলনা শুরু করে, সেখান থেকে ডিরেক্টরি কাঠামোর গভীরে অবতরণ করে (সুতরাং, -maxdepth 0পরীক্ষাগুলি কেবল বেস স্তর বা কমান্ডলাইন আর্গুমেন্টে সীমাবদ্ধ করে, যেখানে ব্যাখ্যা -mindepth 1হিসাবে কমান্ডলাইন আর্গুমেন্ট এড়িয়ে যায় man find)। find /tmp/foo -name 'foo'ডিরেক্টরিটি খালি খালি থাকলেও এই কারণেই একটি ম্যাচ ফলবে।

find . -name 'foo'অন্যদিকে কোনও ফলাফল আসবে না কারণ .(ডট) একটি বিশেষ ফাইল যা একই ইনোডের মতো হার্ডলিঙ্কের মতো কাজ করে /tmp/foo- এটি একটি পৃথক (বিশেষ যদিও) ফাইলের মতো এবং প্রতীকী লিঙ্ক বা অভিব্যক্তির সাথে সম্পর্কিত নয় শেল দ্বারা পথের নাম প্রসারিত। সুতরাং, প্রদত্ত উদাহরণে কমান্ডলাইন আর্গুমেন্টগুলির সন্ধানের দ্বারা প্রয়োগ করা প্রথম পরীক্ষাটি কোনও মিল দেখায় না, যেহেতু .প্রকৃতরূপে বর্ণিত নামের সাথে মেলে না -name 'foo'। না হয় /tmp/foo/.যেহেতু কোনও -nameপ্যাটার্নের জন্য পরীক্ষাটি কেবলমাত্র পথের বেসনামে করা হয় (দেখুন man find), যা এখানে আবার .

যদিও এই আচরণটি ব্যবহারকারীর দৃষ্টিকোণ থেকে প্রত্যাশিত বা স্বজ্ঞাত হিসাবে প্রদর্শিত হতে পারে না (এবং হ্যাঁ, এটি প্রথমে আমাকেও বিভ্রান্ত করেছিল) তবে এটি কোনও বাগ গঠন করে না তবে লোকটিতে বর্ণিত যুক্তি এবং কার্যকারিতা এবং তথ্য পৃষ্ঠাগুলির সাথে সামঞ্জস্য করে ( gnu) সন্ধান করুন।


0

আমি গিলসের উত্তরটি মন্তব্য করার চেষ্টা করেছি, তবে কোনও মন্তব্যে ফিট করার জন্য এটি অনেক দীর্ঘ ছিল। এই কারণে, আমি এটি আমার নিজের প্রশ্নের উত্তর হিসাবে রাখছি।

গিলসের ব্যাখ্যা (এবং শেভেকের পাশাপাশি )ও স্পষ্ট এবং বোধগম্য। এখানে মূল বক্তব্যটি হ'ল কেবলমাত্র findপ্রদত্ত পাথগুলির মধ্যে ফাইলগুলির নামগুলি (পুনরাবৃত্তভাবে) মিলানোর চেষ্টা করে না, তবে এটি প্রদত্ত পাথগুলির মূল নামটিও নিজের সাথে মেলে চেষ্টা করে।

অন্যদিকে, কোনও প্রমাণ আছে যে এই findউপায়টিই বাগ হিসাবে কাজ না করে কাজ করার কথা মনে করা হয়? আমার মতে, ফলাফলগুলি অসামঞ্জস্যপূর্ণ না করলে ভাল হয় find .এবং find ABSOLUTE-PATHকারণ অসঙ্গতি সর্বদা বিভ্রান্তিকর এবং "কী ভুল ছিল" তা বের করার চেষ্টা করে বিকাশকারীকে অনেক সময় নষ্ট করতে পারে। আমার ক্ষেত্রে, আমি একটি স্ক্রিপ্ট লিখছিলাম, এবং একটি চলক থেকে পথ নেওয়া হয়েছিল। সুতরাং আমার স্ক্রিপ্টটি সঠিকভাবে কাজ করার জন্য, আমি যা করতে চাই তা লিখতে পারি find $path/. -name 'pattern'

শেষ অবধি, আমি মনে করি এর জন্য ধারাবাহিক ফলাফল প্রাপ্তি এগিয়ে চলার আগে findসর্বদা .বর্তমান ডিরেক্টরিটি রেখে প্রতিস্থাপন করা যায় ।


-1

fooআপনি যে ডিরেক্টরিতে আপেক্ষিক অনুসন্ধান শুরু করেছিলেন সেখানে ডিরেক্টরিতে কোনও নাম নেই ।

আপনি শুরুতে ডিরেক্টরি হিসাবে পরম নাম ব্যবহার করার সময় gfindরিপোর্ট /tmp/fooকরলে বগী বলে ধরে নিলে আপনি সঠিক ।

Gfindস্ট্যান্ডার্ড থেকে বিভিন্ন বিচ্যুতি রয়েছে, মনে হয় আপনি অন্য একটি খুঁজে পেয়েছেন। আপনি যখন আরও স্ট্যান্ডার্ড কমপ্লায়েন্ট সলিউশন পছন্দ করেন, আমি প্রস্তাব দিই sfindযে এটির একটি অংশ schilytools

-nameডিরেক্টরি অনুসন্ধান ফলাফল প্রয়োগ করে। আপনি যে দুটি ক্ষেত্রে উল্লেখ করেছেন তার কোনওটিই অপারেশন fooথেকে ডিরেক্টরি এন্ট্রি ফিরিয়ে দেবে না readdir()


আমি সন্দেহ করি এটি একটি বাগও। এখানে থেকে আউটপুটটি এখানে রয়েছে find --version: সন্ধান করুন (জিএনইউ সন্ধানকারী) ৪.৪.২ কপিরাইট (সি) ২০০ Foundation ফ্রি সফটওয়্যার ফাউন্ডেশন, ইনক। লাইসেন্স জিপিএলভি ৩ +: জিএনইউ জিপিএল সংস্করণ 3 বা তার পরের < gnu.org/license/gpl.html >
ইয়র্ক

ভাল, আমি find(POSIX প্রত্যয়িত) এর সাথে আপনার উদাহরণ কমান্ডগুলি পরীক্ষা করেছি gfindএবং sfind; আপনি যখন ব্যবহার করবেন তখনই সমস্যাটি উপস্থিত থাকে gfind। লিনাক্স এ, gfindএর নেটিভ নামের অধীনে নয় তবে নামের সাথে ইনস্টল করা আছে find
সুস্পষ্টভাবে

3
find /tmp/foo -name fooআউটপুট করার জন্য এটি সঠিক /tmp/foo। (সিসি @ ইয়র্ক) ওপেনবিএসডি find, জিএনইউ find, ব্যজিবক্স find, সোলারিস findএবং অন্য কোনও পসিক্স-অনুগতদের আচরণ find("প্রাথমিক নামটি সত্য হিসাবে মূল্যায়ন করা হবে যদি ফাইলের নাম পরীক্ষা করা হয় তবে প্যাটার্ন (…)" মিলছে ) - যখন ফাইলের নাম এটি একটি যা পথ অপারেন্ড হিসাবে পাস হয়েছে, কোনও readdirকল জড়িত নেই)।
গিলস 'দুষ্ট হওয়া বন্ধ করুন'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.