-Exddir সঙ্গে সন্ধান করুন


16

আমি যখন চালানোর findসঙ্গে -execdirআমি ফলাফল আমি আশা করেছিলাম না।

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

mkdir -p a/b/c
find . -type d -execdir touch foo \;
$ tree a
a
├── b
   ├── c
   └── foo
└── foo

ডিরেক্টরিতে cকোনও fooফাইল থাকে না । আমি কীভাবে findপ্রতিটি ডিরেক্টরিতে স্থানীয়ভাবে কিছু দেখতে এবং করতে পারি?

উত্তর:


18

প্রতিটি মিলে যাওয়া ফাইলের জন্য (অর্থাত্ প্রতিটি ডিরেক্টরি), findসেই ডিরেক্টরিটিতে স্যুইচ করে (যেমন এর মূল ডিরেক্টরি) এবং নির্দিষ্ট কমান্ডটি কার্যকর করে। যেহেতু কমান্ডটি ম্যাচের নাম ব্যবহার করে না, তাই এটি কখনই সমস্ত ডিরেক্টরিতে কাজ করে না। এই বিশেষ ডিরেক্টরি ট্রি জন্য, আপনি করছেন

(cd . && touch foo)        # because ./a matches
(cd ./a && touch foo)      # because ./a/b matches
(cd ./a/b && touch foo)    # because ./a/b/c matches

প্রতিটি ডিরেক্টরিতে একটি ফাইল তৈরি করতে, আপনি তার -execপরিবর্তে কেবলমাত্র যুক্তিটির ভিতরে -execdirপ্রয়োগের findঅনুমতি প্রদানের পরিবর্তে ব্যবহার করতে পারেন {}(বেশিরভাগ ক্ষেত্রে এবং বিশেষত আমি মনে করি সমস্তগুলি):

find . -type d -exec touch {}/foo +

পসিক্স বহনযোগ্যতার জন্য আপনাকে নিজেরাই ডিরেক্টরী নাম এবং ফাইলের নামের নাম একত্রিত করতে হবে do

find . -type d -exec sh -c 'touch "$0/foo"' {} \;

বা (কিছুটা দ্রুত)

find . -type d -exec sh -c 'for d; do touch "$d/foo"; done' _ {} +

বিকল্পভাবে, আপনি ব্যাশের পুনরাবৃত্তি ওয়াইল্ডকার্ড ম্যাচটি ব্যবহার করতে পারেন। সাবধান থাকুন (ksh এবং zsh এ সম্পর্কিত বৈশিষ্ট্যটির বিপরীতে এবং আপনার findআদেশের বিপরীতে ) বাশ ডিরেক্টরিগুলির প্রতীকী লিঙ্কগুলিতে পুনরাবৃত্তি করে।

shopt -s globstar
for d in **/*/; do touch -- "$d/foo"; done

একটি zsh সমাধান:

touch ./**/(e\''REPLY+=foo'\')

এফওয়াইআই: man bash"-সি" এর অধীনে রাজ্যগুলি: কমান্ড_ স্ট্রিংয়ের পরে আর্গুমেন্টগুলি $ 0 দিয়ে শুরু করে পজিশনাল প্যারামিটারগুলিতে বরাদ্দ করা হয়েছে, তবে "ডি জন্য" $ 1 দিয়ে শুরু হওয়া পজিশনাল প্যারামিটারগুলির মাধ্যমে পুনরাবৃত্তি হবে। "_" হ'ল পাঠ্য যা $ 0 নির্ধারিত হয়েছে এবং ব্যবহৃত হবে না।
চাদ সিকিটার

3

কমান্ডটি প্রতিটি ডিরেক্টরিতে কার্যকর হয় যা একটি মিলিত ফাইল রয়েছে। যেহেতু cডিরেক্টরি থাকে না, এটি মেলে না এবং এভাবে চালানো হবে না।

সমাধানটি ডিরেক্টরী নামটি এক্সিকিডির যুক্তিতে যুক্ত করা হয়, যেমন:

find . -type d -execdir touch {}/foo \;

2

থেকে man file

   -execdir command {} +
          Like  -exec,  but  the  specified  command is run from the subdirectory containing the matched file

আপনার মিলের ডিরেক্টরিটি ডিরেক্টরিতে cথাকে bতাই এক্সিকিউটটি চালানো হয়। আপনি ডিরেক্টরিগুলির পরিবর্তে ফাইলগুলি সন্ধান করছেন এমনটি আপনি যেমন প্রত্যাশা করেছিলেন তেমন কাজ করবে।

ডিরেক্টরিগুলি পাঠানোর মাধ্যমে আপনি সম্ভবত যা চান তা অর্জন করতে পারেন কারণ ডিরেক্টরিগুলির xargsসম্পূর্ণ তালিকা সরবরাহ করা হবে।

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