সমস্ত ডিরেক্টরিতে সিডি করুন, সেই ডিরেক্টরিতে থাকা ফাইলগুলিতে কমান্ড কার্যকর করুন এবং পূর্ববর্তী বর্তমান ডিরেক্টরিতে ফিরে যান


41

আমি একটি স্ক্রিপ্ট লেখার চেষ্টা করছি যা একটি নির্দিষ্ট ডিরেক্টরিতে বহু একক স্তরের সাব ডিরেক্টরি সহ চালিত হবে। স্ক্রিপ্টটি সাব ডিরেক্টরিগুলির প্রত্যেকটিতে সিডি করবে, ডিরেক্টরিতে থাকা ফাইলগুলিতে একটি কমান্ড কার্যকর করবে এবং পরবর্তী ডিরেক্টরিতে চালিয়ে যাওয়ার জন্য সিডি আউট করবে। এই কাজ করতে সবচেয়ে ভালো উপায় কি?


1
প্রদত্ত তথ্যের বর্তমান স্তর প্রদত্ত, আমি এর সাথে কোনও প্রাসঙ্গিকতা দেখছি না youtube-dl
HalosGhost

উত্তর:


83
for d in ./*/ ; do (cd "$d" && somecommand); done

12
সুতরাং যেহেতু উত্তর প্রদানকারী কোনও ধরণের ব্যাখ্যা বাদ দিয়েছে, তাই আমি এর চেষ্টা করব। for d in ./*/একটি লুপ শুরু হয় যা প্রতিটি আইটেম ./*/(ফাইল / ফোল্ডারের একটি তালিকা, এই ক্ষেত্রে) একটি ভেরিয়েবলের মধ্যে সঞ্চয় করে $ddo (cd "$d" && somecommand);লুপের শরীর শুরু করে। দেহের অভ্যন্তরে, এটি একটি সাবশেল শুরু করে cdএবং somecommandকমান্ডগুলি চালায় । যেহেতু এটি একটি শিশু শেল, প্যারেন্ট শেল (যে শেল থেকে আপনি এই কমান্ডটি চালাচ্ছেন) তার CWD এবং অন্যান্য পরিবেশের ভেরিয়েবল ধরে রাখে। doneকেবল লুপের দেহটি বন্ধ করে দেয়।
কিউস

ডিরেক্টরিগুলির সাব ডিরেক্টরিগুলির জন্য এই পদ্ধতিটি:, for d in ./*/ ; do (cd "$d" && ls); doneকাজ করবে না। কিন্তু, for d in ./*/ ; do (cd "$d" && for d in ./*/ ; do (cd "$d" && ls); done ); doneকাজ করবে। এই উদাহরণে কমান্ড হিসাবে ls ব্যবহার করে।
মাইকেল ডিম্মিট

-bash: cd: ./*/: No such file or directory
এস তারেক Ç

15

সর্বোত্তম উপায় হ'ল একেবারে ব্যবহার না করা cd:

find some/dir -type f -execdir somecommand {} \;

execdirমত exec, কিন্তু কাজের ডিরেক্টরি পৃথক:

   -execdir command {} [;|+]
          Like   -exec,   but  the  specified  command  is  run  from  the
          subdirectory containing the matched file, which is not  normally
          the  directory  in  which  you  started  find.  This a much more
          secure  method  for  invoking  commands,  as  it   avoids   race
          conditions  during resolution of the paths to the matched files.

এটি পসিক্স নয়।


এই উপকরণ দিয়ে কাজ করে? আমার কাছে একটি নির্দিষ্ট ফাইল ডাউনলোড করতে হবে তবে আমি * /। লিঙ্ক-টাইপ f -execdir এমডি $ (বিড়াল। লিঙ্ক) {} \; টাইপ করার সময় এটি সনাক্ত করতে পারছে না;
জোনস

@ সুমিংথিং জোনস না, findএই আদেশগুলি কার্যকর করে, যাতে এটি উপকরণ সম্পর্কে সচেতন হবে না। ডিরেক্টরিটি কী mdএবং কী .link?
মুড়ু

.link একটি পাঠ্য ফাইল যা এর ডাউনলোড করার জন্য URL টি রয়েছে। একগুচ্ছ পতাকা সেট সহ বিজয়ী করার জন্য এমডি একটি উপনাম। এ্যালিয়াস সম্পর্কে সচেতন করার কোনও উপায় আছে কি?
কিছু জোন্স 16

আপনার নির্দিষ্ট ব্যবহারের-কেস জন্য @SomethingJones, ইন bash: find . -type f -iname '*.link' -execdir ${BASH_ALIASES[md]} -i {} \;তুমি প্রয়োজন হবে না catসঙ্গে wgetযা হয়েছে, -iএকটি ফাইল থেকে একটি URL- এ পড়ার জন্য পতাকা। এছাড়াও এটি আপনার আসল প্রশ্ন থেকে কিছুটা আলাদা (যেহেতু আপনি কেবল নামকরণ করা ফাইলগুলিতে আগ্রহী বলে মনে করছেন .linkএবং উপস্থিত ফাইলগুলি নয়)
মুরু

আপনি কীভাবে zsh দিয়ে এটি করবেন জানেন? আপনি আমাকে যা দিয়েছিলেন আমি চেষ্টা করেছি এবং একটি "খারাপ প্রতিস্থাপন" ত্রুটি পাচ্ছি। এছাড়াও, আমি কীভাবে .link ফাইলের সামগ্রীটি বের করতে সক্ষম হব? আমি জানি এই ক্ষেত্রে আমার এটির দরকার নেই তবে আমি ধারণা করছি খুব শীঘ্রই এটি করব।
জোন্স 21

2
cd -P .
for dir in ./*/
do cd -P "$dir" ||continue
   printf %s\\n "$PWD" >&2
   command && cd "$OLDPWD" || 
! break; done || ! cd - >&2

উপরের কমান্ডটির কোনও সাব-শেল করার প্রয়োজন নেই - এটি কেবলমাত্র বর্তমান শেলটিতে তার বিকল্প $OLDPWDএবং বিকল্প দ্বারা সনাক্ত করে $PWD। আপনি যখন cd -শেলটি এই দুটি ভেরিয়েবলের মান বিনিময় করেন, মূলত এটি ডিরেক্টরি পরিবর্তন করে। এটি প্রতিটি ডিরেক্টরিতে নাম ছাপায় কারণ এটি সেখানে স্টাডারের কাজ করে।

আমি এটির দ্বিতীয়বার তাকিয়েছি এবং সিদ্ধান্ত নিয়েছি ত্রুটি পরিচালনার মাধ্যমে আমি আরও ভাল কাজ করতে পারি। এটি এমন একটি দিরকে এড়িয়ে যাবে যা এটি করতে পারে না cd- এবং cdস্টাডার কেন হবে তা সম্পর্কে একটি বার্তা প্রিন্ট করবে - এবং এটি breakযদি আপনার commandসাফল্যের সাথে সম্পাদন না করে বা commandকোনওভাবে চালানো আপনার মূল ডিরেক্টরিতে ফিরে আসার ক্ষমতাকে প্রভাবিত করে তবে এটি একটি শূন্য-বহির্গমন কোড হবে - $OLDPWDcd -সেক্ষেত্রে এটি একটি শেষও করে - এবং ফলাফল হিসাবে বর্তমান ওয়ার্ডিং ডিরেক্টরি নামটি স্ট্ডারকে লিখে দেয়।


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