@ মিউ-এর পদ্ধতির অক্ষমতা রয়েছে কারণ তার -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
/ -action
এ find
।
আপনি চালাতে চান তাহলে -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
-true
find
-links +0
-name '*'
-depth -2
,-depth 1
... পদ্ধতির গনুহ এর চেয়ে ভাল হিসাবে দেখা যেতে পারে-maxdepth
/-mindepth