নির্দিষ্ট গভীরতা পজিক্স সীমাবদ্ধ?


15

আমি সম্প্রতি লক্ষ্য করেছি যে এর জন্য পসিক্স স্পেসিফিকেশনগুলিতেfind-maxdepth প্রাথমিকটি অন্তর্ভুক্ত নয় ।

এটির সাথে অপরিচিতদের জন্য, -maxdepthপ্রাথমিকটির উদ্দেশ্য হ'ল কত স্তর গভীরতায় findনেমে আসবে তা সীমাবদ্ধ করা । -maxdepth 0ফলাফল শুধুমাত্র কমান্ড লাইন আর্গুমেন্ট প্রক্রিয়া করা হচ্ছে; -maxdepth 1কমান্ড লাইন আর্গুমেন্ট ইত্যাদির মধ্যেই কেবল ফলাফলগুলি পরিচালনা করবে etc.

আমি কীভাবে -maxdepthকেবল পসিক্স-নির্দিষ্ট বিকল্প এবং সরঞ্জামগুলি ব্যবহার করে নন-পসিক্স প্রাথমিকের সমতুল্য আচরণ পেতে পারি ?

(দ্রষ্টব্য: অবশ্যই আমি প্রথম অপারেন্ড হিসাবে -maxdepth 0ব্যবহার করে এর সমতুল্য পেতে পারি -prune, তবে এটি অন্যান্য গভীরতায় প্রসারিত হয় না))


@StevenPenny, ফ্রিবিএসডি এর -depth -2, -depth 1... পদ্ধতির গনুহ এর চেয়ে ভাল হিসাবে দেখা যেতে পারে -maxdepth/-mindepth
Stéphane Chazelas

@ স্টাফেনচাজেলাগুলি যে কোনও উপায়ে - পসিক্সের অনুসন্ধানের একটি বা অন্য থাকা উচিত; অন্যথায় এটি পঙ্গু
স্টিভেন পেনি

1
কমপক্ষে -maxdepth/ এর জন্য -mindepth, যুক্তিসঙ্গত বিকল্প রয়েছে (নোট এটি -pathপসিক্সের সাম্প্রতিক সংযোজন। -timexyবা -mtime -3m(বা -mmin -3) এর বিকল্পগুলি অনেক বেশি জটিল। কিছু পছন্দ -execdir/ -deleteনির্ভরযোগ্য বিকল্প নেই।
স্টাফেন চেজেলাস

2
@ স্টেভেনপেনি, এটি যুক্ত করার জন্য অস্ট্রিংগ্রপব্যাগসনেটকে নির্বিঘ্নে টিকিট লগইন করুন । আমি যখন দৃ strong় সমর্থনযোগ্যতা পেয়েছিলাম তখন পৃষ্ঠপোষকের প্রয়োজন ছাড়াই জিনিসগুলি যুক্ত হতে দেখেছি। কর্মের একটি আরও ভাল কোর্সটি হ'ল যতগুলি বাস্তবায়ন আগে যুক্ত করা হয় তাই পসিক্সকে কেবল বিদ্যমানটি নির্দিষ্ট করতে হবে যা সাধারণত কম বিতর্কিত হয়।
স্টাফেন চেজেলাস

@ স্টাফেনচেজেলস আমার ক্ষেত্রে আমি কেবল ফাইলগুলির সরাসরি নামকরণ শেষ করেছিলাম, তবে আপনাকে ধন্যবাদ; এটি আবার সামনে এলে আমি টিকিট দায়ের করতে পারি
স্টিভেন পেনি

উত্তর:


7

আপনি -pathএকটি নির্দিষ্ট গভীরতার সাথে মেলে এবং সেখানে ছাঁটাই করতে ব্যবহার করতে পারেন । যেমন

find . -path '*/*/*' -prune -o -type d -print

maxdepth 1, যেমন হবে *ম্যাচ ., */*ম্যাচ ./dir1, এবং */*/*ম্যাচ ./dir1/dir2যা ছেঁটে করা হয়। আপনি যদি একটি নিখুঁত সূচনা ডিরেক্টরি ব্যবহার করেন তবে আপনাকেও একটি শীর্ষস্থানীয় যুক্ত /করতে -pathহবে।


হুঁ মম আপনি কি /*প্যাটার্নের শেষে থেকে কেবল একটি স্তর সরাতে পারবেন না , -oঅপারেটরটি বের করতে পারেন এবং একই ফলাফল পেতে পারেন?
ওয়াইল্ডকার্ড

না, কারণ *ম্যাচগুলিও /তাই, দুয়ারের a/b/c/d/eসাথে মজুর ফিট হবে -path */*
meuh

তবে a/b/c/d/eকখনই পৌঁছে যাবে না , কারণ -pruneএটি প্রয়োগ করা হবে a/b....
ওয়াইল্ডকার্ড

1
দুঃখিত, আমি এটি ভুল পড়েছি -pruneএবং -oসরানো হয়েছে। যদি -pruneসমস্যাটি */*রাখেন তা হ'ল ম্যাক্সডেপথের উপরে স্তরের কোনও কিছুর সাথে মেলে না, যেমন একক ডিরেক্টরি a
meuh

11

@ মিউ-এর পদ্ধতির অক্ষমতা রয়েছে কারণ তার -maxdepth 1পদ্ধতির পরেও findপরে স্তরগুলিকে অন্যথায় উপেক্ষা করার জন্য 1 স্তরের ডিরেক্টরিগুলি পড়তে দেয় । এটি কিছু findবাস্তবায়নের সাথেও ঠিকমত কাজ করবে না (জিএনইউ সহ find) যদি কোনও ডিরেক্টরি নামগুলিতে বাইটের ক্রম থাকে যা ব্যবহারকারীর লোকালয়ে বৈধ অক্ষর তৈরি করে না (যেমন আলাদা অক্ষরের এনকোডিংয়ের ক্ষেত্রে ফাইলের নামের জন্য)।

find . \( -name . -o -prune \) -extra-conditions-and-actions

জিএনইউ -maxdepth 1(বা ফ্রিবিএসডি -depth -2) বাস্তবায়নের আরও প্রচলিত উপায় ।

সাধারণত যদিও, -depth 1আপনি ( -mindepth 1 -maxdepth 1) .গভীরতা 0) বিবেচনা করতে চান না হিসাবে এটি আপনি চান ( এবং তারপরে এটি আরও সহজ:

find . ! -name . -prune -extra-conditions-and-actions

কারণ -maxdepth 2, এটি হয়ে যায়:

find . \( ! -path './*/*' -o -prune \) -extra-conditions-and-actions

আপনি এখানে অবৈধ চরিত্রের সমস্যাগুলি চালিয়ে যান।

উদাহরণস্বরূপ, যদি আপনার কাছে একটি ডিরেক্টরি বলা হয় Stéphaneতবে éএটি 20008 এর মাঝামাঝি পর্যন্ত পশ্চিম ইউরোপ এবং আমেরিকা পর্যন্ত প্রচলিত আইসো 8859-1 (ওরফে ল্যাটিন 1) চরসেটে (0xe9 বাইট) এনকোডড রয়েছে, তবে সেই 0xe9 বাইটটি একটি নয় ইউটিএফ -8 এ বৈধ অক্ষর। সুতরাং, হল UTF-8 লোকেলে, *ওয়াইল্ডকার্ড (কিছু সঙ্গে findবাস্তবায়নের) সাথে মেলে না হবে Stéphaneযেমন *0 বা বেশি অক্ষর এবং 0xe9 একটি অক্ষর নয়।

$ locale charmap
UTF-8
$ find . -maxdepth 2
.
./St?phane
./St?phane/Chazelas
./Stéphane
./Stéphane/Chazelas
./John
./John/Smith
$ find . \( ! -path './*/*' -o -prune \)
.
./St?phane
./St?phane/Chazelas
./St?phane/Chazelas/age
./St?phane/Chazelas/gender
./St?phane/Chazelas/address
./Stéphane
./Stéphane/Chazelas
./John
./John/Smith

আমার find(যখন আউটপুট কোনও টার্মিনালে যায়) ?উপরের মতো অবৈধ 0xe9 বাইট প্রদর্শন করে । আপনি দেখতে পারেন যে St<0xe9>phane/Chazelasছিল না prune

আপনি এটিকে ঘিরে কাজ করতে পারেন:

LC_ALL=C find . \( ! -path './*/*' -o -prune \) -extra-conditions-and-actions

তবে নোট করুন যে findএটির সমস্ত লোকাল সেটিংস এবং এটি প্রয়োগ হওয়া কোনও অ্যাপ্লিকেশনকে প্রভাবিত করে (যেমন -execপূর্বাভাসের মাধ্যমে )।

$ LC_ALL=C find . \( ! -path './*/*' -o -prune \)
.
./St?phane
./St?phane/Chazelas
./St??phane
./St??phane/Chazelas
./John
./John/Smith

এখন, আমি সত্যিই একটি -maxdepth 2নোট পেয়েছি তবে ইউটিএফ -8 এ সঠিকভাবে এনকোড হওয়া দ্বিতীয় ??স্টাফানে কীভাবে T এর ইউটিএফ -8 এনকোডিংয়ের 0xc3 0xa9 বাইট (সি লোকালে দুটি স্বতন্ত্রিত অক্ষর হিসাবে বিবেচিত) হিসাবে প্রদর্শিত হয় সি লোকালে মুদ্রণযোগ্য অক্ষর নয়।

এবং আমি যদি একটি যুক্ত করে থাকি তবে আমি -name '????????'ভুল স্টাফেন (যেটি আইসো 8859-1-এ এনকোড করা হয়েছে) পেয়েছিলাম।

এর পরিবর্তে স্বেচ্ছাসেবক পাথগুলিতে প্রয়োগ করতে ., আপনি করতেন:

find some/dir/. ! -name . -prune ...

-mindepth 1 -maxdepth 1বা এর জন্য :

find some/dir/. \( ! -path '*/./*/*' -o -prune \) ...

জন্য -maxdepth 2

আমি এখনও একটি করতে হবে:

(cd -P -- "$dir" && find . ...)

প্রথম কারণ এটি পাথগুলিকে সংক্ষিপ্ত করে তোলে যা এটি খুব দীর্ঘ পথে চালিত হওয়ার সম্ভাবনা কম করে বা দীর্ঘ তালিকার তালিকার তালিকা তৈরি করে তবে findস্বেচ্ছাসেবী পথ আর্গুমেন্টগুলিকে সমর্থন করতে পারে না ( -fফ্রিবিএসডি বাদে find) যেহেতু এটি বন্ধ হয়ে যাবে will $dirমত !বা এর মান -print...


-oঅস্বীকৃতি সঙ্গে একযোগে একটি সাধারণ কৌতুক দুটি স্বাধীন সেট চালানো হয় -condition/ -actionfind

আপনি চালাতে চান তাহলে -action1সাক্ষাৎ ফাইল -condition1এবং স্বাধীনভাবে -action2ফাইল মিটিং উপর -condition2, আপনি কি পারে না:

find . -condition1 -action1 -condition2 -action2

হিসাবে -action2শুধুমাত্র ফাইল দেখা চালানোর হবে উভয় শর্ত।

তাছাড়াও:

find . -contition1 -action1 -o -condition2 -action2

হিসাবে -action2ফাইল দেখা চালানোর হবে না উভয় শর্ত।

find . \( ! -condition1 -o -action1 \) -condition2 -action2

প্রতিটি ফাইলের জন্য সত্য হিসাবে \( ! -condition1 -o -action1 \)সমাধান হিসাবে কাজ করে। যে অনুমান একটি কর্ম (ভালো হয় , ) যে সবসময় ফেরৎ সত্য । মত কর্মের জন্য যে ফেরত দিতে পারেন মিথ্যা , আপনি অন্য যোগ করতে পারেন যেখানে নিরীহ কিন্তু ফেরৎ সত্য মত গনুহ মধ্যে বা বা (যদিও নোট উপরে অবৈধ অক্ষর সম্পর্কে ইস্যু)।-action1-prune-exec ... {} +-exec ... \;-o -something-something-truefind-links +0-name '*'


1
কোনও দিন আমি একগুচ্ছ চীনা ফাইলগুলিতে চলে যাব এবং আমি খুব খুশি হব যে আমি স্থানীয় এবং বৈধ অক্ষরের বিষয়ে আপনার অনেক উত্তর পড়েছি। :)
ওয়াইল্ডকার্ড

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

0

আমি একটি ইস্যুতে ছুটে এসেছি যেখানে একাধিক পাথ অনুসন্ধান করার সময় আমার গভীরতা সীমাবদ্ধ করার একটি উপায় প্রয়োজন (কেবলমাত্র পরিবর্তে .)।

উদাহরণ স্বরূপ:

$ find dir1 dir2 -name myfile -maxdepth 1

এটি আমাকে -রেজেক্স ব্যবহার করে একটি বিকল্প পদ্ধতির দিকে নিয়ে যায়। সংক্ষেপটি হ'ল:

-regex '(<list of paths | delimited>)/<filename>'

সুতরাং, উপরেরটি হবে:

$ find dir1 dir2 -name myfile -regextype awk -regex '(dir1|dir2)/myfile' # GNU
$ find -E dir1 dir2 -name myfile -regex '(dir1|dir2)/myfile' # MacOS BSD

কোনও ফাইল নাম ছাড়াই:

$ find dir1 dir2 -name myfile -maxdepth 1 # GNU

-regex '(<list of paths | delimited>)/<anything that's not a slash>$'

$ find dir1 dir2 -name myfile -regextype awk -regex '(dir1|dir2)/[^/]*$' # GNU
$ find -E dir1 dir2 -name myfile -regex '(dir1|dir2)/[^/]*$' # MacOS BSD

অবশেষে, -maxdepth 2রেজেক্সের জন্য এতে পরিবর্তন হয়:'(dir1|dir2)/([^/]*/){0,1}[^/]*$'


1
এই প্রশ্নটি যদিও একটি স্ট্যান্ডার্ড (পসিক্সের মতো) সমাধান চায়। এছাড়াও -maxdepthএকাধিক অনুসন্ধান পাথ সঙ্গে কাজ করবে।
কুসালানন্দ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.