অপ্রস্তুত নক্ষত্রের কারণে ত্রুটিগুলি এড়ানো


16

ব্যাশে আমি প্রায়শই নীচের মতো লুপগুলি ব্যবহার করি

for file in *.type; do 
  sommecommand "$file"; 
done;

সমস্ত ফাইল মিলে একটি অপারেশন সঞ্চালন *.type। যদি কার্যসম্পাদিত ডিরেক্টরিগুলিতে এই সমাপ্তির সাথে কোনও ফাইল না পাওয়া যায় তবে তারকাচিহ্নটি প্রসারিত হয় না এবং সাধারণত আমি একটি ত্রুটি বার্তা পেয়ে যাব যে সামারকম্যান্ড ফাইলটি খুঁজে পায়নি। এই ত্রুটিটি এড়াতে আমি তত্ক্ষণাত বিভিন্ন উপায় সম্পর্কে ভাবতে পারি। তবে শর্তযুক্ত যোগ করা খুব মার্জিত বলে মনে হয় না। এটি অর্জনের জন্য কি কোনও সংক্ষিপ্ত এবং পরিষ্কার উপায় আছে?

উত্তর:


20

হ্যাঁ, নিম্নলিখিত কমান্ডটি চালান:

shopt -s nullglob

এটি ম্যাচটি বাতিল করবে এবং কোনও ত্রুটি ট্রিগার হবে না।

  • আপনি যদি ডিফল্টরূপে এই আচরণটি চান, আপনার কমান্ডটি যুক্ত করুন ~/.bashrc
  • আপনি যদি পসিক্স শেলের কোনও নাল গ্লোব সনাক্ত করতে চান তবে চেষ্টা করুন

    for i in *.txt; do
      [ "$i" = '*.txt' ] && [ ! -e '*.txt' ] && continue
    done

Http://mywiki.wooledge.org/ নালগ্লোব দেখুন


1
দ্রষ্টব্য যে কোনও ফাইল কল করা আসলে সম্ভব *.txt। ফাইলটি উপস্থিত রয়েছে কিনা তা যাচাই করা উচিত।
ক্রিস ডাউন

পোস্ট অনুসারে সম্পাদিত।
গিলস কুইনট

@ ক্রিসডাউন নোট করুন যে আপনার উত্তরের মত একই মন্তব্যটি এখানে প্রযোজ্য (এর breakপরিবর্তে সম্ভবত আরও গুরুতর পরিণতি সহ continue)।
স্টাফেন চেজেলাস

6

shopt -s nullglobকোনও ম্যাচ না থাকলে খালি অ্যারেতে প্রসারিত করতে আপনি ব্যাশে ব্যবহার করতে পারেন ।

বিনা পজিক্স শেলগুলিতে nullglob, আপনি যে ফাইল নামটি পাস করছেন তা আসলে [ -e "$file" ] || [ -L "$file" ] || continueআপনার forলুপের প্রথম অংশ হিসাবে রয়েছে তা পরীক্ষা করে আপনি এই সমস্যাটি এড়াতে পারবেন ।


1
মনে রাখবেন যে এটি [ -eঅ্যাক্সেসযোগ্য ফাইল বা ফাইলগুলি যা অ্যাক্সেসযোগ্য বা অযৌক্তিক ফাইলগুলিতে প্রতীকযুক্ত ফাইলগুলির জন্য মিথ্যা ফিরিয়ে দেবে তা কঠোরভাবে সমতুল্য হবে না ।
স্টাফেন চেজেলাস

@ স্টাফেনচাজেলাস, সিমলিংকগুলি সম্পর্কিত বিষয়গুলি স্বীকার করতে দিন। তবে "অ্যাক্সেসযোগ্য ফাইলগুলি" দ্বারা আপনার মনে কী আছে? আমি যদি chmod 0 the_file, [ -e the_file ]এখনো সত্য মূল্যায়ণ, তাই এটি অন্য কিছু হতে হবে।
সন্দেহভাজনজিম

1
ভাঙা প্রতিলিপিগুলি পরিচালনা করতে সম্পাদনা জমা দেওয়া হয়েছে। আশা করি ঠিক আছে
সন্দেহজনক জিম

2
@ সন্দেহজনক জিম mkdir -p x/{a,b} && chmod 444 x && echo x/* && [ -e x/a ],। এক্স / এ অ্যাক্সেসযোগ্য তবে এক্স পড়ার মতো এক্স / * প্রসারিত হবে।
স্টাফেন চেজেলাস

@ স্টাফেনচাজেলাস, দুর্দান্ত, ব্যাখ্যা করার জন্য ধন্যবাদ।
dubiousjim

4

শেলগুলির জন্য সাধারণ কৌশল যা nullglobবিকল্প নেই is

set -- [*].type *.type
case $1$2 in
  '[*].type*.type') shift 2;;
  *) shift
esac
for file do
  cmd  -- "$file"
done

অতিরিক্ত [*].typeহ'ল *.typeবর্তমান ডিরেক্টরিটিতে একটি ফাইল কল করা কেসটি কভার করা ।

এখন, আপনি যদি ডট ফাইলগুলি অন্তর্ভুক্ত করতে চান তবে এটি আরও জটিল হয়ে ওঠে

আমি বিলম্বিত হলাম যে কৌশলটি কয়েক বছর আগে ইউরনেটে লরা ফেয়ারহেড দ্বারা তৈরি করা হয়েছিল।


0

find . -name '*.type' -maxdepth 0 -exec somecommand "{}" ";"

এটি forসম্পূর্ণভাবে সমীকরণ থেকে লুপ এবং শেলের গ্লোব্বিং সরিয়ে দেয়। প্রতি ম্যাচে একবার কমান্ড findকার্যকর করবে -execএবং যদি কোনও মিল না থাকে তবে তা কখনই কার্যকর করা হবে না। -maxdepth 0নির্দেশ করে (নামে পথ-যুক্তির সাবডিরেক্টরি মধ্যে recurse না খুঁজে .এই ক্ষেত্রে,)।

ক্ষতিটি হ'ল এটিতে আরও একটি অ্যাপ্লিকেশন জড়িত, যদিও এটি প্রতিটি লিনাক্স সিস্টেমে কার্যত উপস্থিত রয়েছে (এবং সম্ভবত বেশিরভাগ ইউনিক্সও রয়েছে)।

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