সমস্ত উপ-ডিরেক্টরিকে ট্র্যাক করুন এবং ইউনিক্স শেল স্ক্রিপ্টে কিছু করুন


17

আমি চাই আমার শেল স্ক্রিপ্টটি একটি প্রধান ডিরেক্টরিতে সমস্ত উপ-ডিরেক্টরিতে গিয়ে দেখুক। ডিরেক্টরিতে কিছু করুন, একটি স্পুল ফাইলে প্রেরিত আউটপুট এবং পরবর্তী ডিরেক্টরিতে যান। মেইন দিরকে বিবেচনা করুন = / টিএমপি সাব দির = এবিসিডি (চারটি সাব ডিরেক্টরি)


2
ঠিক আছে, দয়া করে আমাদের এ পর্যন্ত আপনার স্ক্রিপ্টটি দেখান। এর কোন অংশ আপনাকে সমস্যা দিচ্ছে?
টেরডন

উত্তর:


22

একটি forলুপ ব্যবহার করুন :

for d in $(find /path/to/dir -maxdepth 1 -type d)
do
  #Do something, the directory is accessible with $d:
  echo $d
done >output_file

এটি কেবল ডিরেক্টরিটির উপ-ডিরেক্টরি অনুসন্ধান করে /path/to/dir। নোট করুন যে ডিরেক্টরিগুলির নামগুলিতে সাদা স্থান বা বিশেষ অক্ষরগুলি অন্তর্ভুক্ত থাকলে উপরের সহজ উদাহরণটি ব্যর্থ হবে। একটি নিরাপদ পদ্ধতি হল:

find /tmp -maxdepth 1 -type d -print0 |
  while IFS= read -rd '' dir; do echo "$dir"; done

বা সরলভাবে bash:

for d in /path/to/dir/*; do
  if [ -d "$d" ]; then
    echo "$d"
  fi
done

(নোট করুন যে এর বিপরীতে findডিরেক্টরিতে প্রতিলিঙ্কগুলি বিবেচনা করে এবং লুকানোগুলি বাদ দেয়)


1
কমপক্ষে এরূপ আউটপুট প্রক্রিয়াজাতকরণের সাথে সম্পর্কিত সীমাবদ্ধতা এবং ঝুঁকিগুলি নির্দেশ করুন find
স্টাফেন চেজেলাস

হাই ... আমি ডি-তে লুপের জন্য নীচে দৌড়ানোর চেষ্টা করেছি (সন্ধান / ব্যাকআপ / আশীষ - ম্যাক্সডেপথ 1 -প্রকার d) কর ls -l | জব '{মুদ্রণ $ 9}' | গ্রেপ সিসি * _ date +"%m%d20%Y"| xargs প্রতিধ্বনি $ d
আশীষ

হাই ... আমি লুপের জন্য নীচে চেষ্টা করেছি। ডি-তে $ (সন্ধান / ব্যাকআপ / আশীষ-ম্যাক্সডেপথ 1-টাইপ ডি) করুন ls -l | awk '{প্রিন্ট $ 9}' | গ্রেপ সিসি * _date +"%m%d20%Y" | xargs প্রতিধ্বনি প্রতিধ্বনিত $ d প্রত্যাশিত ফলাফলটি সমস্ত উপ-ডিরেক্টরি থেকে ls -ltr হবে । উপরে লুপ কাজ করছে না
আশীষ ২

1

আমি সম্পূর্ণ bashনবাগত, তবে ইউএন * এক্স অভিজ্ঞ। যদিও নিঃসন্দেহে এটি ব্যাশ শেল স্ক্রিপ্টিংয়ে করা যায়, পুরানো দিনগুলিতে আমরা find [-maxdepth <levels>] <start-dir> -exec <command> ;এটি অর্জন করতাম । আপনি এটি করতে man findএবং চারপাশে খেলতে পারতেন , যতক্ষণ না কেউ আপনাকে কীভাবে এটি করতে হয় তাকে বলা অবধি bash!


আমি খুব চাটুকার যে এখানে আমার "রূপরেখা" উত্তরটি একটি আপ-ভোট পেয়েছে। তবে, নীচে @ চাওসের জবাব কেন ডাউন-ভোট পেয়েছে? (এই বোর্ডের একজন নবাগত হিসাবে, আমি তার উত্তরটির বিরুদ্ধে এই মন্তব্যটি পোস্ট করতে পারি না, কেবল আমার নিজের বিরুদ্ধে)) তার দ্বিতীয় পরামর্শটি শেল স্ক্রিপ্ট সমাধানের জন্য সঠিক, এবং বাহ্যিক findকমান্ড চালনার ওভারহেড এড়ানো যায় ।
জোনব্রেভ

তাঁর দ্বিতীয় সত্যই সঠিক। ডিরেক্টরিতে যদি সাদা নামের স্থান বা বিশেষ অক্ষর থাকে (উদাহরণস্বরূপ ব্যাকস্ল্যাশস) থাকে তবে তার প্রথম ব্যর্থ হবে। নিরাপদ সংস্করণের জন্য আমি তার উত্তরে সম্পাদনাটি দেখুন।
টেরডন

আমি রাজী. এটি তাঁর দ্বিতীয়, শেল-ওয়ান উত্তর যা আমি প্রশংসা করছিলাম।
জোনব্রেভ

আমি জানি, আমি কেবল ডাউনভোটটি ব্যাখ্যা করছিলাম (যা আমি কাস্ট করি নি)।
টেরডন

আমি এটা নিক্ষেপ করেছি। $(find...)জিনিস খারাপ অভ্যাস
স্টাফেন চেজেলাস

1

দেখে মনে হচ্ছে আপনি প্রতিটি সাবডায়ারের অধীনে ফাইলের নাম চান; ls -l | awkশক্তসমর্থ যথেষ্ট, যদি ঐ ফাইলের নামের হোয়াইটস্পেস এবং / বা নতুন লাইন গঠিত জন্য নয়? নীচে findএমনকি তাদের জন্য কাজ করবে findনা যে ডোনোট -maxdepthতাদের জন্য কাজ করবে:

find . ! -name . -type d -prune -exec sh -c '
   cd "$1" && \
   find "." ! -name . -prune  -type f
' {} {} \;

0

আমি সমাধান পেয়েছি। নীচের ফাইন্ড কমান্ডটি আমার প্রয়োজনীয়তা পূরণ করে।

find . -maxdepth 1 -type d \( ! -name . \) -exec bash -c "cd '{}' && ls -l |awk '{ print $9 }' |grep `date +"%m%d%Y"`|xargs echo" \;

0

এলএস, গ্রেপ এবং টিআর ব্যবহার করে এটিও সম্ভব

for dir in $(ls -1FA | grep / | tr -d /); do echo $dir/something; done

ls -1FA | grep / | tr -d / | while IFS= read -r TD; do echo $TD/something; done

du / সেড এছাড়াও নির্বাচক হিসাবে ব্যবহার করা যেতে পারে যদি আপনার এলএস এর উপরের বিকল্পগুলির অভাব থাকে

du --max-depth=1 | sed -e 's/^.*\.\///' | grep -v '\.$'

এই উদাহরণগুলি লুকিয়ে থাকা ডিরেক্টরিগুলি ফিরে আসে এবং পিতামাতার এবং বর্তমান ডিরেক্টরিগুলি বাদ দেয় তা লক্ষ করা গুরুত্বপূর্ণ important


1
(1)  যখন স্ট্যান্ডার্ড আউটপুটটি পাইপ হয় তখন ডিফল্ট হিসাবে lsপ্রতি লাইনে একটি ফাইল ( -1বিকল্পটি কী সুনির্দিষ্ট করে) লিখবে (সুতরাং এটি আপনার উত্তরগুলিতে অতিমাত্রায়)। (2) আউটপুট পার্সিং lsএকটি খারাপ ধারণা - দেখুন এই এবং এই । ডিরেক্টরিগুলির নামগুলিতে স্পেস (বা নিউলাইন) থাকলে আপনার প্রথম উত্তরটি ব্যর্থ হবে এবং তাদের নামে নতুন লাইন থাকলে সমস্ত ব্যর্থ হবে। (3) আপনার সর্বদা শেল ভেরিয়েবলগুলি উদ্ধৃত করা উচিত (উদাহরণস্বরূপ, "$dir") যদি আপনার না জরুরী কারণ না থাকে এবং আপনি নিশ্চিত হন যে আপনি কী করছেন তা নিশ্চিত।
স্কট

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