কোনও গ্লোবের বাশ কোনও ম্যাচ আছে কিনা তা পরীক্ষা করুন


223

যদি আমি একটি একক ফাইলের অস্তিত্বের জন্য যাচাই করতে চাই তবে আমি এটি ব্যবহার করে test -e filenameবা এর জন্য পরীক্ষা করতে পারি [ -e filename ]

মনে করি আমার কাছে একটি গ্লোব রয়েছে এবং আমি জানতে চাই যে এমন কোনও ফাইল রয়েছে যার নাম গ্লোবটির সাথে মেলে। গ্লোব 0 টি ফাইলের সাথে মেলে (এমন ক্ষেত্রে আমার কিছু করার দরকার নেই), বা এটি 1 বা আরও বেশি ফাইলের সাথে মেলে (এমন ক্ষেত্রে আমার কিছু করা দরকার)। গ্লোবটির কোনও মিল আছে কিনা তা আমি কীভাবে পরীক্ষা করতে পারি? (আমি এখানে কতগুলি ম্যাচ আছে ifসেদিকে খেয়াল রাখিনা এবং আমি যদি একটি বিবৃতি এবং কোনও লুপ দিয়ে এটি করতে পারি তবে সবচেয়ে ভাল হবে (কেবল কারণ আমি সর্বাধিক পাঠযোগ্য able

( test -e glob*যদি গ্লোব একাধিক ফাইলের সাথে মেলে তবে ব্যর্থ হয়))


3
আমি সন্দেহ করি যে নীচের আমার উত্তরটি 'স্পষ্টভাবে সঠিক' এমনভাবে রয়েছে যাতে অন্য সমস্ত ধরণের হ্যাক-আশেপাশে থাকে। এটি একটি এক-লাইন শেল-বিল্টিন যা প্রায় চিরকাল ছিল এবং এটি 'এই নির্দিষ্ট কাজের জন্য লক্ষ্যযুক্ত সরঞ্জাম' বলে মনে হয়। আমি উদ্বিগ্ন যে ব্যবহারকারীরা ভুল করে গৃহীত উত্তর এখানে উল্লেখ করবে। কেউ দয়া করে আমাকে সংশোধন করতে দ্বিধা বোধ করবেন এবং আমি এখানে আমার মন্তব্য প্রত্যাহার করব, আমি ভুল হতে পেরে আরও খুশি এবং এ থেকে শিখি। পার্থক্যটি যদি এত কঠোর না দেখা যায় তবে আমি এই বিষয়টি উত্থাপন করব না।
ব্রায়ান ক্রিসম্যান

1
এই প্রশ্নের আমার প্রিয় সমাধান আছে find কমান্ডের যা কোনো শেল (এমনকি অ বোর্ন শাঁস) কাজ করে কিন্তু গনুহ এটি প্রয়োজন আছে এবং compgen কমান্ড যা স্পষ্টভাবে একটি Bashism হয়। খুব খারাপ আমি উভয় উত্তর গ্রহণ করতে পারি না।
কেন ব্লুম

দ্রষ্টব্য: এই প্রশ্নটি জিজ্ঞাসা করার পরে এটি সম্পাদনা করা হয়েছে। আসল শিরোনামটি ছিল "কোনও গ্লোব বাশের কোনও ম্যাচ আছে কিনা তা পরীক্ষা করুন"। আমি আমার উত্তর প্রকাশের পরে নির্দিষ্ট শেল, 'বাশ'টিকে প্রশ্ন থেকে বাদ দেওয়া হয়েছিল। প্রশ্নের শিরোনাম সম্পাদনা আমার উত্তরটিকে ত্রুটিযুক্ত বলে মনে করে। আমি আশা করি যে কেউ এই পরিবর্তনটি সংশোধন করতে পারে বা কমপক্ষে সমাধান করতে পারে।
ব্রায়ান ক্রিসম্যান

উত্তর:


178

ব্যাশ নির্দিষ্ট সমাধান:

compgen -G "<glob-pattern>"

প্যাটার্নটি এড়িয়ে চলুন বা এটি ম্যাচে প্রাক প্রসারিত হবে।

প্রস্থান স্থিতিটি হ'ল:

  • কোন ম্যাচের জন্য 1,
  • 'এক বা একাধিক ম্যাচের' জন্য

stdoutবিশ্বব্যাপী মিলে যাওয়া ফাইলগুলির একটি তালিকা ।
আমি মনে করি সংক্ষিপ্ততার দিক থেকে এবং সম্ভাব্য পার্শ্ব প্রতিক্রিয়া হ্রাস করার ক্ষেত্রে এটি সর্বোত্তম বিকল্প।

আপডেট : উদাহরণ ব্যবহারের অনুরোধ।

if compgen -G "/tmp/someFiles*" > /dev/null; then
    echo "Some files exist."
fi

9
দ্রষ্টব্য যে compgenএকটি বাশ- স্পেসিফিক বিল্ট-ইন কমান্ড এবং POSIX স্ট্যান্ডার্ড ইউনিক্স শেল নির্দিষ্ট বিল্ট-ইন কমান্ডের অংশ নয়। pubs.opengroup.org/onlinepubs/9699919799 pubs.opengroup.org/onlinepubs/9699919799/utilities/… অতএব, অন্যান্য শেলগুলির বহনযোগ্যতা উদ্বেগজনক যেখানে স্ক্রিপ্টগুলিতে এটি ব্যবহার করা এড়িয়ে চলুন।
ডায়োমিডিস স্পিনেলিস

1
আমার কাছে মনে হয় ব্যাশ বিল্টিনগুলি ব্যতীত অনুরূপ প্রভাবটি অন্য কোনও কমান্ড ব্যবহার করা হবে যা কোনও গ্লোবগুলিতে কাজ করে এবং যদি কোনও ফাইল মেলে না তবে ব্যর্থ হয়, যেমন: এলএস: if ls /tmp/*Files 2>&1 >/dev/null; then echo exists; fi- কোড গল্ফের জন্য সম্ভবত দরকারী? গ্লোব হিসাবে একই নামে একটি ফাইল রয়েছে, যা গ্লোবটির সাথে মিলে যাওয়া উচিত নয়, যদি ব্যর্থ হয় তবে যদি এটি হয় তবে আপনার সম্ভবত বড় সমস্যা রয়েছে।
দেউই মরগান

4
@ দেবীমোরগান এটি সহজ:if ls /tmp/*Files &> /dev/null; then echo exists; fi
ক্লে ব্রিজগুলি

উপর compgenman bashhelp compgen
তদন্তের

2
হ্যাঁ, এটিকে উদ্ধৃত করুন বা ফাইলের নাম ওয়াইল্ডকার্ড প্রাক-প্রসারিত হবে। কমপেজেন "দির / *। এক্সট"
ব্রায়ান ক্রিসম্যান

169

নাল্ল্লোব শেল বিকল্পটি আসলে একটি বাশিজম।

নালাগ্লাব রাষ্ট্রটি পুনরুদ্ধার করার জন্য ক্লান্তিকর সংরক্ষণ এবং পুনরুদ্ধারের প্রয়োজন এড়াতে, আমি কেবল এটিকে বিশ্বব্যাপী প্রসারিত সাব-শেলের ভিতরে স্থাপন করব:

if test -n "$(shopt -s nullglob; echo glob*)"
then
    echo found
else
    echo not found
fi

আরও ভাল বহনযোগ্যতা এবং আরও নমনীয় গ্লোবিংয়ের জন্য, সন্ধান করুন:

if test -n "$(find . -maxdepth 1 -name 'glob*' -print -quit)"
then
    echo found
else
    echo not found
fi

স্পষ্ট -print -quit কর্মের জন্য ব্যবহার করা হয় খোঁজ ডিফল্ট অন্তর্নিহিত পরিবর্তে -print যাতে কর্ম খোঁজ যেমন অনুসন্ধানের মিলে প্রথম ফাইলটি খুঁজে বের করে যত তাড়াতাড়ি প্রস্থান করা হবে। যেখানে ফাইল ম্যাচ প্রচুর, এই তুলনায় অনেক দ্রুত চালানো উচিত echo glob*বাls glob* এবং এটি প্রসারিত কমান্ড লাইন overstuffing সম্ভাবনা (কিছু শেল একটি 4K সময়ের সীমা আছে) এড়াতে।

যদি খোঁজ Overkill মত আর এবং ম্যাচ হওয়ার সম্ভাবনা ফাইলের সংখ্যা ছোট, ব্যবহার পরিসংখ্যান:

if stat -t glob* >/dev/null 2>&1
then
    echo found
else
    echo not found
fi

10
findঠিক সঠিক বলে মনে হচ্ছে এটির কোন কোণ নেই, যেহেতু শেলটি সম্প্রসারণ করছে না (এবং অন্য কোনও কমান্ডে অপরিবর্তিত গ্লোব পাস করছে), এটি শাঁসের মধ্যে বহনযোগ্য (যদিও আপনি ব্যবহার করা সমস্ত বিকল্পই পসিক্স দ্বারা নির্দিষ্ট করা হয়নি), এবং এটির চেয়ে দ্রুততর ls -d glob*(পূর্ববর্তী গৃহীত উত্তর) যখন এটি প্রথম ম্যাচে পৌঁছায় তখন এটি বন্ধ হয়ে যায়।
কেন ব্লুম

1
মনে রাখবেন যে এই shopt -u failglobবিকল্পগুলির কোনওরকম বিরোধ হতে পারে বলে এই উত্তরের প্রয়োজন হতে পারে ।
ক্যালিমো

findসমাধান হিসেবে ভাল কোন উল্লিখিত glob অক্ষর সঙ্গে একটি ফাইলের নাম ম্যাচ হবে। এই ক্ষেত্রে, আমি এটি চেয়েছিলেন কি। যদিও কিছু সচেতন হতে হবে।
আমরা সমস্ত মনিকা 14 ই

1
যেহেতু অন্য কেউ আমার উত্তর সম্পাদনা করার সিদ্ধান্ত নিয়েছে যাতে এটি স্পষ্টতই বলা যায়।
ফ্ল্যাবডব্লেট

1
unix.stackexchange.com/questions/275637/…-maxdepth POSIX অনুসন্ধানের বিকল্পটি কীভাবে প্রতিস্থাপন করা যায় তা আলোচনা করে ।
কেন ব্লুম

25
#!/usr/bin/env bash

# If it is set, then an unmatched glob is swept away entirely -- 
# replaced with a set of zero words -- 
# instead of remaining in place as a single word.
shopt -s nullglob

M=(*px)

if [ "${#M[*]}" -ge 1 ]; then
    echo "${#M[*]} matches."
else
    echo "No such files."
fi

2
কোনও nullglobএকক ফলাফল প্যাটার্নের সমান কিনা তা পরীক্ষা করে দেখার পরিবর্তে কোনও সম্ভাব্য মিথ্যা "কোনও মিল নেই" সেট এড়াতে । কিছু নিদর্শন সেই নামগুলির সাথে মেলে যা এই প্যাটার্নের সাথে ঠিক সমান (যেমন a*b; তবে উদাহরণ নয় a?bবা [a])।
ক্রিস জনসেন

আমি মনে করি যে এটি অত্যন্ত সম্ভাবনাময় সুযোগে ব্যর্থ হয়েছে যা আসলে গ্লোবের মতো একটি ফাইল রয়েছে। (যেমন, কেউ দৌড়েছিল touch '*py'), তবে এটি আমাকে অন্য একটি ভাল দিক নির্দেশ করে।
কেন ব্লুম

আমি এটি সবচেয়ে সাধারণ সংস্করণ হিসাবে পছন্দ করি।
কেন ব্লুম

এবং সংক্ষিপ্ততম। আপনি যদি কেবল একটি ম্যাচের প্রত্যাশা করেন তবে আপনি "$M"শর্টহ্যান্ড হিসাবে ব্যবহার করতে পারেন "${M[0]}"। অন্যথায়, ভাল আপনার ইতিমধ্যে অ্যারে ভেরিয়েবলের গ্লোব সম্প্রসারণ রয়েছে, সুতরাং আপনি এটিকে বিশ্বব্যাপী পুনঃ-প্রসারণ না করে তালিকা হিসাবে অন্য জিনিসগুলিতে স্থান দেওয়ার জন্য জিটিজি g
পিটার কর্ডস

খুশী হলাম। আপনি এম আরও দ্রুত পরীক্ষা করতে পারেন (কম বাইটস এবং কোনও [প্রক্রিয়া তৈরি না করে)if [[ $M ]]; then ...
টোবিয়া

22

আমি পছন্দ করি

exists() {
    [ -e "$1" ]
}

if exists glob*; then
    echo found
else
    echo not found
fi

এটি উভয়ই পঠনযোগ্য এবং দক্ষ (যদি বিপুল সংখ্যক ফাইল না থাকে)।
মূল অসুবিধাটি হ'ল এটি দেখতে দেখতে অনেক বেশি সূক্ষ্ম এবং আমি মাঝে মাঝে একটি দীর্ঘ মন্তব্য যুক্ত করতে বাধ্য বোধ করি।
যদি কোনও মিল থাকে, "glob*"শেল দ্বারা প্রসারিত হয় এবং সমস্ত ম্যাচ পাস হয়ে যায় exists(), যা প্রথমটি পরীক্ষা করে এবং বাকিগুলি উপেক্ষা করে।
কোনও মিল না থাকলে, "glob*"পাস করা হয়exists() না থাকে তবে তা এবং সেখানে উপস্থিত না থাকলে পাওয়া যায়।

সম্পাদনা করুন: একটি মিথ্যা ইতিবাচক থাকতে পারে, মন্তব্য দেখুন


13
এটি গ্লোব পজিটিভ ফিরিয়ে দিতে পারে যদি গ্লোব এমন কিছু হয় *.[cC](সেখানে ফাইল cবা Cফাইল নাও হতে পারে তবে একটি ফাইল বলা হয়ে থাকে *.[cC]) বা মিথ্যা নেতিবাচক যদি প্রথম ফাইলটি থেকে প্রসারিত হয় উদাহরণস্বরূপ একটি অসামঞ্জস্যিত ফাইল বা একটি ফাইলের মধ্যে একটি সিমলিংক হয় ডিরেক্টরিতে আপনার অ্যাক্সেস নেই (আপনি উপায় যুক্ত করতে চান || [ -L "$1" ])।
স্টিফেন চেজেলাস

মজাদার. শেলচেক রিপোর্ট করেছেন যে -e0 বা 1 টি ম্যাচ থাকলে গ্লোব্বিং কেবল তখনই কাজ করে । এটি একাধিক ম্যাচের জন্য কাজ করে না, কারণ এটি হয়ে যাবে [ -e file1 file2 ]এবং এটি ব্যর্থ হবে। যৌক্তিক ও প্রস্তাবিত সমাধানের জন্য github.com/koalaman/shellcheck/wiki/SC2144 দেখুন ।
টমাস প্রেক্সল

10

আপনার যদি গ্লোবফল সেট থাকে আপনি এই ক্রেজি ব্যবহার করতে পারেন (যা আপনার সত্যিকারের উচিত নয়)

shopt -s failglob # exit if * does not match 
( : * ) && echo 0 || echo 1

অথবা

q=( * ) && echo 0 || echo 1

2
একটি নূপুরের দুর্দান্ত ব্যবহার ব্যর্থ। কখনও ব্যবহার করা উচিত নয় ... তবে সত্যই সুন্দর। :)
ব্রায়ান ক্রিসম্যান

আপনি প্যারেন্সের ভিতরে দোকানটি রাখতে পারেন। এইভাবে এটি কেবল পরীক্ষার উপর প্রভাব ফেলে:(shopt -s failglob; : *) 2>/dev/null && echo exists
ফ্ল্যাবডব্লেট

8

পরীক্ষার -তে দুর্ভাগ্যজনক সতর্কতা রয়েছে যা এটি ভাঙ্গা প্রতীকী লিঙ্কগুলিকে অস্তিত্বহীন বলে বিবেচনা করে। সুতরাং আপনি তাদের জন্যও পরীক্ষা করতে চাইতে পারেন।

function globexists {
  test -e "$1" -o -L "$1"
}

if globexists glob*; then
    echo found
else
    echo not found
fi

4
স্টিফেন চেজেলাস যেমন ড্যান ব্লচের উত্তরের জন্য তুলে ধরেছে তেমনি এই ফাইল-নেমগুলিতে ভুয়া-পজিটিভ ঠিক করা যায় না যার মধ্যে তাদের মধ্যে বিশেষ-অক্ষর রয়েছে b (যদি আপনি নীলগ্লোব দিয়ে বানর না রেখে))
পিটার কর্ডেস

3
আপনি এড়াতে shoud -oএবং -atest/ [। উদাহরণস্বরূপ, এখানে, এটি বেশিরভাগ বাস্তবায়নের সাথে থাকলে এটি ব্যর্থ $1হয় =[ -e "$1" ] || [ -L "$1" ]পরিবর্তে ব্যবহার করুন।
স্টিফেন চেজেলাস

4

MYYN এর উত্তর কিছুটা সহজ করার জন্য, তার ধারণার ভিত্তিতে:

M=(*py)
if [ -e ${M[0]} ]; then
  echo Found
else
  echo Not Found
fi

4
বন্ধ করুন, তবে কী আপনি যদি মিলছেন [a], একটি ফাইলের নাম আছে [a], তবে কোনও ফাইলের নাম নেই a? আমি এখনও nullglobএই জন্য পছন্দ করি । কিছু এটিকে পেডেন্টিক হিসাবে দেখতে পারে তবে আমরা যুক্তিসঙ্গত হিসাবে পুরোপুরি সঠিক হতে পারি।
ক্রিস জনসন

@ sondra.kinsey এটি ভুল; আক্ষরিক ফাইলের নাম নয়, [a]কেবল গ্লোবটি মিলবে । a[a]
ট্রিপলি

4

ফ্ল্যাবলেটব্লেটের উত্তরের উপর ভিত্তি করে , আমার কাছে এটিকে শেলের উপরে গ্লোব সম্প্রসারণের সময়, নিজেকে খুঁজে পেতে কেবল সবচেয়ে সহজ মনে হয় (অগত্যা দ্রুত নয়)

find /some/{p,long-p}ath/with/*globs* -quit &> /dev/null && echo "MATCH"

বা ifমত:

if find $yourGlob -quit &> /dev/null; then
    echo "MATCH"
else
    echo "NOT-FOUND"
fi

এটি হ'ল আমি ইতিমধ্যে স্ট্যাট ব্যবহার করে যে সংস্করণটি উপস্থাপন করেছি তার মতো কাজ করে; স্ট্যাটের চেয়ে কীভাবে "সহজ" তা নিশ্চিত নয়।
ফ্লাবড্যাবলেট

3
সচেতন থাকুন যে &> পুনঃনির্দেশটি একটি বাশিজম, এবং অন্য শেলের মধ্যে চুপচাপ ভুল কাজটি করবে।
ফ্লাবড্যাবলেট

এটি ফ্ল্যাবডব্লিটের findউত্তরের চেয়ে ভাল বলে মনে হচ্ছে কারণ এটি গ্লোবগুলিতে পাথগুলি গ্রহণ করে এবং এটি আরও ক্ষয়প্রাপ্ত হয় ( -maxdepthইত্যাদি প্রয়োজন হয় না )। এটি তার statউত্তরের চেয়েও ভাল বলে মনে হচ্ছে কারণ এটি statপ্রতিটি অতিরিক্ত গ্লোব ম্যাচে অতিরিক্ত ইনগ করা চালিয়ে যায় না । আমি প্রশংসা করব যদি কেউ কোণার ক্ষেত্রে অবদান রাখতে পারে যেখানে এটি কাজ করে না।
drwatsoncode

1
আরও বিবেচনার পরে, আমি যুক্ত করব -maxdepth 0কারণ এটি শর্ত যুক্ত করার ক্ষেত্রে আরও নমনীয়তার অনুমতি দেয়। যেমন ধরুন আমি ফলাফলটি কেবলমাত্র ফাইলের সাথে সীমাবদ্ধ করতে চাই। আমি চেষ্টা করতে পারে find $glob -type f -quit, কিন্তু যে সত্য ফিরে যদি উল্লিখিত glob একটি ফাইল মেলেনি, কিন্তু একটি ডিরেক্টরি সাথে মেলে না অন্তর্ভুক্ত একটি ফাইল (এমনকি যাও recursively)। বিপরীতে find $glob -maxdepth 0 -type f -quitকেবল সত্যটি ফিরে আসবে যদি গ্লোব নিজেই কমপক্ষে একটি ফাইলের সাথে মেলে। নোটটি যে maxdepthবিশ্বব্যাপী একটি ডিরেক্টরি উপাদান থাকতে বাধা দেয় না। (এফওয়াইআই 2>যথেষ্ট, কোনও প্রয়োজন নেই &>)
ড্রওয়াতসনকোড

2
findপ্রথম স্থানে ব্যবহারের বিষয়টি হ'ল শেলটি তৈরি হওয়া এড়ানো এবং গ্লোব ম্যাচের সম্ভাব্য বিশাল তালিকাটি বাছাই করা; find -name ... -quitসর্বাধিক একটি ফাইলের সাথে মিলবে। যদি কোনও স্ক্রিপ্ট গ্লোব মিলগুলির শেল-উত্পাদিত তালিকার সাথে পাস করার উপর নির্ভর করে find, findতবে অনুরোধ করা অপ্রয়োজনীয় প্রক্রিয়া-প্রারম্ভিক ওভারহেড ছাড়া কিছুই অর্জন করে না। খালি শূন্যতার জন্য সরাসরি ফলাফলের তালিকাটি পরীক্ষা করা দ্রুত এবং স্পষ্ট হবে।
ফ্ল্যাবলেটস

4

আমার আরও একটি সমাধান রয়েছে:

if [ "$(echo glob*)" != 'glob*' ]

এটি আমার পক্ষে সুন্দরভাবে কাজ করে। আমি কিছু কর্নার কেস মিস করছি?


2
যদি ফাইলটির প্রকৃত নাম 'গ্লোব *' হয় তবে ব্যতীত কাজ করে।
ইয়ান কেলিং

ভেরিয়েবল হিসাবে গ্লোব পাস করার জন্য কাজ করে - যখন একাধিক ম্যাচ থাকে তখন "অনেক যুক্তি" ত্রুটি দেয়। "$ (প্রতিধ্বনি $ গ্লোব)" কোনও একক স্ট্রিং ফিরিয়ে দিচ্ছে না বা কমপক্ষে একে একক হিসাবে ব্যাখ্যা করা যায় না তাই অনেকগুলি আর্গুমেন্ট ত্রুটি
ডি কেবলার

@ ডি কেবেলার: এটি একক স্ট্রিং হিসাবে ব্যাখ্যা করা উচিত, কারণ এটি ডাবল-কোটে আবৃত রয়েছে।
ব্যবহারকারী 1934428

3

বাশে, আপনি একটি অ্যারেতে গ্লোব করতে পারেন; যদি গ্লোবটি মেলে না, আপনার অ্যারেতে একটি একক প্রবেশ থাকবে যা কোনও বিদ্যমান ফাইলের সাথে মিল নয়:

#!/bin/bash

shellglob='*.sh'

scripts=($shellglob)

if [ -e "${scripts[0]}" ]
then stat "${scripts[@]}"
fi

দ্রষ্টব্য: আপনি যদি nullglobসেট করে scriptsরেখেছেন তবে খালি অ্যারে হবে এবং পরিবর্তে [ "${scripts[*]}" ]বা এর সাথে আপনার পরীক্ষা করা উচিত [ "${#scripts[*]}" != 0 ]। আপনি যদি এমন একটি লাইব্রেরি লিখছেন যা অবশ্যই সাথে বা তার বাইরে কাজ nullglobকরবে, আপনি চাইবেন

if [ "${scripts[*]}" ] && [ -e "${scripts[0]}" ]

এই পদ্ধতির একটি সুবিধা হ'ল গ্লোব অপারেশনটির পুনরাবৃত্তি না করে আপনি যে ফাইলগুলির সাথে কাজ করতে চান তার তালিকা আপনার কাছে রয়েছে।


কেন, নাল্লগ্লোব সেট এবং অ্যারে সম্ভবত খালি, আপনি এখনও পরীক্ষা করে দেখতে পারবেন না if [ -e "${scripts[0]}" ]...? আপনি কি শেল বিকল্পের নাম সেটটি স্থাপনের সম্ভাবনার অনুমতি দিচ্ছেন ?
জনহরফ

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

1

এই ঘৃণা কাজ করে বলে মনে হচ্ছে:

#!/usr/bin/env bash
shopt -s nullglob
if [ "`echo *py`" != "" ]; then
    echo "Glob matched"
else
    echo "Glob did not match"
fi

এটি সম্ভবত sh প্রয়োজন, বাশ প্রয়োজন।

এটি কাজ করে কারণ নাল্ল্লোব বিকল্পটি কোনও মিল না থাকলে গ্লোবকে একটি খালি স্ট্রিংয়ের মূল্যায়ন করে। সুতরাং প্রতিধ্বনি কমান্ড থেকে কোনও খালি খালি আউটপুট ইঙ্গিত দেয় যে গ্লোব কিছু মিলছে।


আপনার ব্যবহার করা উচিতif [ "`echo *py`" != "*py"]

1
যদি কোনও ফাইল বলা হয় তবে এটি সঠিকভাবে কাজ করবে না *py
রায়ান সি। থম্পসন

সঙ্গে কোন ফাইল শেষ আছে কিনা py, `echo *py`মূল্যায়ন করা হবে *py
ইগল

1
হ্যাঁ, তবে এটির জন্যও যদি এমন একটি ফাইল বলা *pyহয় যা ভুল ফলাফল।
রায়ান সি থম্পসন

আমি ভুল হলে আমাকে সংশোধন করুন, তবে কোনও ফাইল মিলছে না *py, তবে আপনার স্ক্রিপ্টটি "গ্লোব মিলেছে" প্রতিধ্বনিত হবে?
ইয়েগেল

1

আমি এই উত্তরটি দেখতে পাইনি, তাই আমি ভেবেছিলাম আমি এটি এখানে রেখে দেব:

set -- glob*
[ -f "$1" ] && echo "found $@"

1
set -- glob*
if [ -f "$1" ]; then
  echo "It matched"
fi

ব্যাখ্যা

যখন সেখানে একটি ম্যাচ নয় glob*, তাহলে $1উপস্থিত থাকবে 'glob*'। পরীক্ষাটি -f "$1"সত্য হবে না কারণ glob*ফাইলটি নেই।

কেন এটি বিকল্পগুলির চেয়ে ভাল

এটি sh এর সাথে কাজ করে এবং ডেরিভেট করে: ksh এবং bash। এটি কোনও উপ-শেল তৈরি করে না। $(..)এবং `...`কমান্ডগুলি একটি উপ-শেল তৈরি করে; তারা একটি প্রক্রিয়া কাঁটাচামচ, এবং তাই এই সমাধানের চেয়ে ধীর।


1

এই মত (পরীক্ষার ফাইলযুক্ত pattern):

shopt -s nullglob
compgen -W *pattern* &>/dev/null
case $? in
    0) echo "only one file match" ;;
    1) echo "more than one file match" ;;
    2) echo "no file match" ;;
esac

এটি এর চেয়ে অনেক বেশি ভাল compgen -G: কারণ আমরা আরও বেশি কেস এবং আরও স্পষ্টভাবে বৈষম্য করতে পারি।

শুধুমাত্র একটি ওয়াইল্ডকার্ড নিয়ে কাজ করতে পারে *


0
if ls -d $glob > /dev/null 2>&1; then
  echo Found.
else
  echo Not found.
fi

মনে রাখবেন যে প্রচুর ম্যাচ বা ফাইল অ্যাক্সেস ধীর হয়ে থাকলে এটি খুব সময়সাপেক্ষ হতে পারে।


1
[a]ফাইলটি [a]উপস্থিত থাকলে এবং ফাইলটি aঅনুপস্থিত থাকলে একটি প্যাটার্ন ব্যবহার করা হলে এটি ভুল উত্তর দেবে । এটি "পাওয়া" বলবে যদিও এটি কেবলমাত্র ফাইলের সাথে মিলিত হওয়া উচিত a, এটি আসলে উপস্থিত নেই।
ক্রিস জনসন

এই সংস্করণটি একটি সাধারণ পসিক্স / বিন / শ (বাশিজম ব্যতীত) কাজ করা উচিত, এবং যে ক্ষেত্রে আমার এটির প্রয়োজন এটির ক্ষেত্রে, গ্লোবটি আর যাইহোক বন্ধনী রাখে না, এবং যেগুলি আছে সেগুলি সম্পর্কে আমার চিন্তা করার দরকার নেই are মারাত্মক রোগতাত্ত্বিক। তবে আমি অনুমান করি যে কোনও ফাইল কোনও গ্লোব মিলছে কিনা তা পরীক্ষা করার ভাল উপায় নেই।
কেন ব্লুম

0
#!/bin/bash
set nullglob
touch /tmp/foo1 /tmp/foo2 /tmp/foo3
FOUND=0
for FILE in /tmp/foo*
do
    FOUND=$((${FOUND} + 1))
done
if [ ${FOUND} -gt 0 ]; then
    echo "I found ${FOUND} matches"
else
    echo "No matches found"
fi

2
এই সংস্করণটি ব্যর্থ হয় যখন একটি ফাইল যথাযথভাবে মেলে তবে nullglobশেল বিকল্পটি ব্যবহার করে আপনি FOUND = -1 কুলজ এড়াতে পারবেন ।
কেন ব্লুম

@ কেন: হুম, আমি কলডেজ ডাকব না nullglob। আসল প্যাটার্নের সাথে একক ফলাফলের তুলনা করা একটি ক্লডজ (এবং মিথ্যা ফলাফলের প্রবণ), ব্যবহার করা nullglobহয় না।
ক্রিস জনসন

@ ক্রিস: আমার মনে হয় আপনি ভুলভাবে পড়েছেন। আমি nullglobকলডেজ ডাকিনি।
কেন ব্লুম

1
@ কেন: আসলে, আমি ভুল পড়েছি read আমার অবৈধ সমালোচনার জন্য দয়া করে আমার ক্ষমা প্রার্থনা করুন।
ক্রিস জনসেন

-1
(ls glob* &>/dev/null && echo Files found) || echo No file found

5
ডিরেক্টরি মেলে glob*এবং উদাহরণস্বরূপ আপনার যদি সেই ডিরেক্টরিগুলির তালিকা লেখার জন্য লিখিত না থাকে তবে এটিও মিথ্যা প্রত্যাবর্তন করবে ।
স্টিফেন চেজেলাস

-1

ls | grep -q "glob.*"

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


-2
[ `ls glob* 2>/dev/null | head -n 1` ] && echo true

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