ডিরেক্টরি বাদ দিয়ে ফাইলের মধ্য দিয়ে লুপ করুন


11

আমার ডিরেক্টরিতে যে কোনও উপ ডিরেক্টরি বাদ দিয়ে বর্তমান ডিরেক্টরিতে প্রতিটি ফাইলের জন্য আমার কিছু স্ক্রিপ্ট দরকার need

উদাহরণস্বরূপ, বর্তমান পথে, 5 টি ফাইল রয়েছে তবে তার মধ্যে 1 টি একটি ফোল্ডার (একটি উপ ডিরেক্টরি)। আমার স্ক্রিপ্টে বলা স্ক্রিপ্ট চলাকালীন আর্গুমেন্ট হিসাবে প্রদত্ত একটি কমান্ড সক্রিয় করা উচিত। অর্থাৎ "বাশ স্ক্রিপ্ট ডাব্লুসি-ডাব্লু" -কে বর্তমান ডিরেক্টরিতে প্রতিটি ফাইলের শব্দের গণনা দেওয়া উচিত, তবে কোনও ফোল্ডার নয়, যাতে আউটপুটটিতে কখনই কোনও "/ সাব / ডির: কোনও ডিরেক্টরি" ডিরেক্টরি হয় না।

আমার বর্তমান স্ক্রিপ্ট:

#!/bin/bash
dir=`pwd`
for file in $dir/*
do
    $* $file
done

লুপের জন্য আমাকে কেবল ডিরেক্টরিগুলি বাদ দিতে হবে, তবে কীভাবে তা আমি জানি না।

উত্তর:


11
#!/bin/bash -

for file in "$dir"/*
do
  if [ ! -d "$file" ]; then
      "$@" "$file"
  fi
done

নোট করুন যে এটি টাইপ সিমলিংকযুক্ত ফাইলগুলিকেও বাদ দেয় এবং যেখানে সিমলিংক কোনও টাইপের ডিরেক্টরিতে ফাইল ফাইলের সমাধান করে (যা সম্ভবত আপনি চান)।

বিকল্প (মন্তব্য থেকে), কেবল ফাইলের জন্য পরীক্ষা করুন:

for file in "$dir"/*
do
  if [ -f "$file" ]; then
      "$@" "$file"
  fi
done

@ রাইমা ভাল ধারণা!
লকতক

2
ব্যবহার করা ভাল if [ -f "$file" ]; then ...। কোনও ডিরেক্টরি নয় কেবল নিয়মিত ফাইলগুলিই নয় সকেট এবং সিমলিংকগুলিও ফিরবে।
জেআরফারগসন

@ জেআরফেরগসন ওপির প্রশ্নের ভিত্তিতে আমি বলব যে সকেট এবং পাইপ সহ একটি সত্যিই খারাপ ধারণা হবে। সিমলিংকের ক্ষেত্রে, সেগুলি ! -dইতিমধ্যে ইতিমধ্যে অন্তর্ভুক্ত রয়েছে ।
রোয়াইমা

আমি আমার চূড়ান্ত স্ক্রিপ্টে [-f $ ফাইল] ব্যবহার করেছি। যদি শর্তে উদ্ধৃতি চিহ্নের অভাবটি লক্ষ্য করুন। প্রায় সব জায়গাতেই আমি দেখেছি $ ফাইলের চারপাশে উদ্ধৃতি চিহ্ন রয়েছে, তবুও আমার স্ক্রিপ্টটি কাজ করার জন্য আমাকে সেগুলি মুছতে হয়েছিল।
টনিস পাইপ

3

লুপের জন্য লুপ ব্যবহারের বিকল্প এখানে আপনার যা করা দরকার তা যদি সহজ হয় (এবং মূল শেল এবং সি এর মধ্যে ভেরিয়েবল সেট করার সাথে জড়িত না)।

সাব-ডিরেক্টরিতে পুনরাবৃত্তি এড়াতে আপনি এর findসাথে ব্যবহার করতে পারেন -execএবং ব্যবহার -maxdepth 1করতে পারেন ।

[ -n "$1" ] && find "$dir" -type f -mindepth 1 -maxdepth 1 -exec "$@" "{}" \;

[ -n "$1" ]ডিরেক্টরির মধ্যে সব ফাইল নির্বাহ স্ক্রিপ্ট কোনো আর্গুমেন্ট পাস করা হয় না যখন এড়ানো হয়।


2

Zsh এ, আপনি ফাইলের ধরণের মাধ্যমে ওয়াইল্ডকার্ড ম্যাচগুলিকে সীমাবদ্ধ করতে গ্লোব কোয়ালিফায়ার ব্যবহার করতে পারেন । উদাহরণস্বরূপ, (.)প্যাটার্নটির পরে যুক্ত করা এটি নিয়মিত ফাইলগুলিতে সীমাবদ্ধ করে।

wc -w *(.)

ফাইলের নাম থেকে শুরু করে সঙ্গে মানিয়ে নিতে -বা ., ব্যবহার wc -c -- *(.N)বা wc -c ./*(.N)। আপনি যদি নিয়মিত ফাইলগুলিতে প্রতীকী লিঙ্কগুলিও অন্তর্ভুক্ত করতে চান তবে এটি তৈরি করুন *(-.)

অন্যান্য সাধারণ শেলগুলির তেমন কোনও বৈশিষ্ট্য নেই, সুতরাং আপনাকে ফাইল দ্বারা ফিল্টারিংয়ের জন্য কিছু লুপ বা ফাইলের পরীক্ষার মতো কিছু আলাদা পদ্ধতি ব্যবহার করা দরকার find


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