সন্ধান করুন: ছাঁটাই নির্দিষ্ট পথটিকে অগ্রাহ্য করে না


13

.gitআমার findঅনুসন্ধান থেকে আমাকে বাদ দিতে হবে । এটির জন্য, আমি -path ./.git -pruneস্যুইচটি ব্যবহার করছি :

$ find . -path ./.git -prune -o \( -type f -o -type l -o -type d \) | grep '.git'
./.git

তবে, এটি .git ডিরেক্টরিতে থাকা সামগ্রীর বিষয়বস্তু এড়িয়ে গেলেও, এটি ডিরেক্টরিটি নিজেই তালিকাভুক্ত করে। আমি যুক্ত করার পরে এটি কাজ করে-path ./.git -prune -o -print -a

find . -path ./.git -prune -o -print -a \( -type f -o -type l -o -type d \) | grep '.git'

কেন এটি প্রয়োজনীয়? আমি ভেবেছিলাম যে দুটি কমান্ডের একই আউটপুট থাকা উচিত। দ্বিতীয় বাক্য গঠনটি বেশ কুরুচিপূর্ণ।


4
আপনার একটি দরকার -print, অন্যথায় অন্তর্নিহিত -printপুরো শর্তে প্রযোজ্য
স্টাফেন চেজেলাস


উত্তর:


3

manজন্য পৃষ্ঠা findদেয়:

-prune True; if the file is a directory, do not  descend  into  it.  If
      -depth  is  given,  false;  no  effect.  Because -delete implies
      -depth, you cannot usefully use -prune and -delete together.

সুতরাং প্রথম উদাহরণে এটি -path ./.git -pruneঅসত্য নয় তাই ডিফল্ট ক্রিয়া (-print ) কল করা হবে না, সুতরাং লাইনটি মুদ্রিত হয়।


22

findকমান্ড দ্বারা ছাঁটাই করা ডিরেক্টরিগুলি কেন ছাপানো হয়েছিল তা এবং আমি কীভাবে -pruneকাজ করেছি তার কয়েকটি জটিল জটিল বিবরণ নিয়ে আমি বিভ্রান্ত হয়ে পড়েছিলাম , তবে কয়েকটি উদাহরণ দিয়ে এটি বের করতে সক্ষম হয়েছি।

নীচের উদাহরণগুলি চালনার জন্য নিম্নলিখিত ডিরেক্টরি এবং ফাইলগুলি তৈরি করুন।

mkdir aa
mkdir bb
touch file1
touch aa/file1
touch bb/file3

এই কাঠামোটি তৈরি করতে:

$ tree

.
├── aa
   └── file1
├── bb
   └── file3
└── file1

নামের জন্য ডিরেক্টরি অনুসন্ধান করতে এখন ব্যবহার করুন aa। এখানে কোন সমস্যা নেই।

$ find . -type d -name aa
./aa

এএ ব্যতীত অন্য সমস্ত ডিরেক্টরি সন্ধান করুন এবং আমরা বর্তমান ডিরেক্টরিটি পাই .এবং ./bbএটিও বোধগম্য হয়।

$ find . -type d ! -name aa
.
./bb

এতদূর ভাল, তবে আমরা যখন ব্যবহার করি -prune, তখন ছাঁটাই করা ডিরেক্টরিটি ফিরে পাই যা প্রাথমিকভাবে আমাকে বিভ্রান্ত করেছিল কারণ আমি আশা করছিলাম যে এটি অন্য সমস্ত ডিরেক্টরি ফিরে পাবে এবং ছাঁটাই করা হচ্ছে না।

$ find . -type d -name aa -prune
./aa

কারণ কেন এটিকে ডিরেক্টরির ছেঁটে হচ্ছে ব্যাখ্যা করা হয়, না ফেরৎ -pruneman পৃষ্ঠা নির্দেশিত হিসাবে বিভাগে টিমো এর উত্তর কিন্তু এ EXPRESSIONSঅধ্যায়:

অভিব্যক্তি ছাড়া অন্য কোনো অ্যাকশন থাকে -prune,  -printসমস্ত ফাইল, যার জন্য অভিব্যক্তি সত্য উপর সঞ্চালিত হয়।

যার অর্থ, যেহেতু এক্সপ্রেশন aaডিরেক্টরি নামের সাথে মিলে যায় তাই এক্সপ্রেশনটি সত্যের সাথে মূল্যায়ন করবে এবং এটি মুদ্রণ করা হবে কারণ -printপুরো কমান্ডের শেষে অন্তর্নিহিতভাবে একটি যুক্ত করা হবে তা সন্ধান করুন। এটি কোনও যুক্ত করবে না -print, তবে আপনি যদি উদ্দেশ্যমূলকভাবে অ্যাকশনটি -o -printনিজেই শেষ করেন:

find . -type d -name aa -prune -o -print
.
./file1
./bb
./bb/file3

এখানে সন্ধানের কমান্ডটি আরও অন্তর্ভুক্ত করে -printনা, এবং সেই ডিরেক্টরিটি আমরা ছাঁটাই করছি (aa করছি তা মুদ্রিত হবে না।

সুতরাং অবশেষে, আমরা যদি একটি ধারা যুক্ত করি যা এর file*পরে ফাইলের নাম প্যাটার্ন সহ ফাইলগুলির সন্ধান করে -o, তবে আপনাকে -printদ্বিতীয় দফাটির শেষে এই প্রবন্ধটি রাখতে হবে:

find . \( -type d -name aa -prune \) -o \( -type f -name 'file*' -print \)
./file1
./bb/file3

এই কাজটি করার কারণটি একই কারণ: যদি আপনি -printদ্বিতীয় ধারাটিতে কিছু না রাখেন , তবে যেহেতু ক্রিয়া ব্যতীত অন্য কোনও পদক্ষেপ নেই -prune, -printসন্ধানের ফলে কমান্ডের সমাপ্তিতে একটি স্বয়ংক্রিয়ভাবে যুক্ত হবে , যার ফলে -pruneধারাটি মুদ্রণযোগ্য হবে ছাঁটাই ডিরেক্টরি:

find . \( \( -type d -name aa -prune \) -o \( -type f -name 'file*' \) \) -print
./aa
./file1
./bb/file3

সাধারণভাবে, আপনাকে -printদ্বিতীয় ধারাতে কমান্ডটি স্থাপন করতে হবে। আপনি যদি এটি মূল পোস্টারের মতো করে মাঝখানে রাখেন তবে এটি সঠিকভাবে কাজ করবে না কারণ ছাঁটাই করা ফাইলগুলি তাত্ক্ষণিকভাবে মুদ্রণ করা হবে এবং দ্বিতীয় ধারাটি যে ফাইলগুলি চায় সেগুলি বাছাই করার সুযোগ পাবে না:

find . \( -type d -name aa -prune -o -print \) -o \( -type f -name 'file*' \)
.
./file1
./bb
./bb/file3

দুর্ভাগ্যক্রমে, মূল পোস্টারটি উপরে রেখে কমান্ডটি ভুল পেয়েছে -print ভুল জায়গায় । এটি তার নির্দিষ্ট ক্ষেত্রে কাজ করতে পারে, তবে এটি সাধারণ ক্ষেত্রে কাজ করে না।

এমন হাজার হাজার লোক রয়েছে যারা কীভাবে -pruneকাজ করে তা বুঝতে সমস্যা হয় । findমানুষ পৃষ্ঠাটিকে এই কমান্ড সম্পর্কে অফুরন্ত বিশ্বব্যাপী বিভ্রান্তির প্রতিরোধ করার জন্য আপডেট করা উচিত নয়।


আমার ম্যান পেজ (আর্চ লিনাক্স find-4.6.0) বলে, "যদি পুরো এক্সপ্রেশনটিতে -প্রিন বা -প্রিন্ট ব্যতীত অন্য কোনও পদক্ষেপ না থাকে, সমস্ত ফাইলের জন্য -প্রিন্ট সঞ্চালিত হয় যার জন্য পুরো অভিব্যক্তিটি সত্য" " আপনি বর্ণনা হিসাবে কিন্তু কাজ করে।
এক্স-ইউরি

0

manপৃষ্ঠা থেকে ,

একটি সম্পূর্ণ ডিরেক্টরি গাছকে উপেক্ষা করার জন্য, গাছের প্রতিটি ফাইল পরীক্ষা করার পরিবর্তে -প্রুন ব্যবহার করুন। উদাহরণস্বরূপ, ডিরেক্টরি `src / emacs 'এবং এর অধীনে থাকা সমস্ত ফাইল এবং ডিরেক্টরিগুলি এড়িয়ে যেতে এবং পাওয়া অন্য ফাইলগুলির নাম মুদ্রণ করতে, এই জাতীয় কিছু করুন:

find . -path ./src/emacs -prune -o -print

সুতরাং, আপনি ব্যবহার করতে পারেন:

find . -path ./.git -prune -o -print

এটি .gitডিরেক্টরিটি তালিকাভুক্ত করবে না ।

কোনও ফাইলের নাম নির্দিষ্ট করতে, আপনি এটি করতে পারেন:

find . -path ./.git -prune , -name filename

,কমা অপারেটর লক্ষ্য করুন ।


-1

এখানে একটি দ্রুত এবং নোংরা বিকল্প রয়েছে:

find | fgrep -v /.git

আমি কেবল findএর জটিল বাক্য গঠনটি মনে করতে পারি না ...

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