बैश में, एक-चर नाम के साथ फ़ाइल का परीक्षण कर सकते हैं-* का उपयोग करते हुए?


0

मेरे पास एक अगर है तो एक निश्चित फाइलों की तलाश में। वे सभी काम के साथ शुरू करते हैं, इसलिए मैं या तो एक सेट कर सकता हूं या फिर हर एक के लिए या मैं उम्मीद कर रहा था कि एक तरीका है जिससे मैं एक तार का उपयोग कर सकता हूं।

यहाँ मेरे पास क्या है और मैंने क्या कोशिश की।

 d=myfolder
 if [[ -e $d/lib* ]]; then
  mv /etc/launchd.conf $d/launchd.conf
 else
  2>/dev/null; true
 fi

इसलिए जैसा कि आप देख सकते हैं, यदि उनमें से कोई भी लीब फाइल मौजूद है तो मैं लॉन्चड.कॉन्फ फाइल को भी स्थानांतरित करना चाहता हूं। लेकिन तारांकन यह नहीं कर रहा है। कोई विचार?

जवाबों:


1

से man bash

[[ expression ]]
      Return a status of 0 or 1 depending on the evaluation of the conditional 
      expression expression.  Expressions  are composed  of  the primaries 
      described below under CONDITIONAL EXPRESSIONS. Word splitting and pathname
      expansion are not performed on the words between the [[ and ]]; tilde 
      expansion, parameter and variable  expansion,  arithmetic expansion, command 
      substitution, process substitution, and quote removal are performed.
      Conditional operators such as -f must be unquoted to be recognized as primaries.

या संक्षेप में, पैटर्न का विस्तार नहीं है।

एक साधारण विकल्प की तरह लग सकता है

if [[ $(echo $d/lib*) != "$d/lib*" ]]; then
    mv /etc/launchd.conf $d/launchd.conf
fi

यह कैसे काम करता है पर संक्षिप्त विवरण:

  • echo $d/lib*लाइब्रेरी फ़ाइलों की एक सूची में फैलता है यदि कोई मौजूद है, तो यह सूची नहीं के बराबर है $d/lib*(जिसे विस्तार नहीं मिलता है) इसलिए mvनिष्पादित किया जाता है
  • OTOH यदि कोई लाइब्रेरी फ़ाइल मौजूद नहीं है, तो इको स्ट्रिंग लौटाता है $d/lib*, !=गलत का मूल्यांकन करता है और mvइसे निष्पादित नहीं किया जाता है

मैं आपके द्वारा प्रदान किए गए विकल्प को लागू करने का प्रयास कर रहा हूं, लेकिन यह वह नहीं है जो मुझे चाहिए। इसके अलावा, मुझे स्पष्ट करने की आवश्यकता हो सकती है, मैं फ़ाइल-नाम को जोड़ने के लिए तारांकन का उपयोग कर रहा हूं, निष्पादन योग्य खोजने के लिए नहीं। मैं यह समझाने का प्रयास करने जा रहा हूं कि यदि मैं इसे सही समझ रहा हूं तो विकल्प क्या देखता है।
एलरोजिटो

हो सकता है कि मैंने आपके सवाल को गलत समझा हो, लेकिन क्या आपका लक्ष्य यह देखने का नहीं है कि कोई फाइल मेल खा रही है या नहीं $d/lib*?
nohillside

क्षमा करें, मैंने अपनी टिप्पणी हाहा के अंत में जोड़ने के लिए बहुत इंतजार किया। लक्ष्य यह देखना है कि क्या कोई फाइल $ d / lib से मेल खाती है ... क्योंकि कई फाइलें हैं जो सभी लीब से शुरू होती हैं लेकिन किसी और चीज में समाप्त होती हैं। उदाहरण: libgenkit.dylib, libgenkitsa.dylib, libimckit.dylib, libimckitsa.dylib। इसलिए, यदि उन फ़ाइलों में से कोई भी $ d फ़ोल्डर में है, तो मैं launchd.conf को स्थानांतरित करना चाहता हूं। यदि वे नहीं हैं, तो कुछ भी मत करो। अगर चर (myfolder) / lib * संलग्न है, तो myfolder / lib * के समान नहीं है (इस प्रकार, यदि यह सच है) तो launchd.conf ले जाएँ।
एलरोजिटो

जो है, अगर मैं किसी प्रकार का टाइपो नहीं बनाता, तो विकल्प क्या करना चाहिए। echo $d/lib*लाइब्रेरी फ़ाइलों की एक सूची में फैलता है यदि कोई मौजूद है, तो यह सूची नहीं के बराबर है $d/lib*(जो विस्तारित नहीं होती है) इसलिए mvइसे निष्पादित किया जाता है। OTOH यदि कोई लाइब्रेरी फ़ाइल मौजूद नहीं है, तो प्रतिध्वनि लौटती है $d/lib*, !=गलत का मूल्यांकन करती mvहै और निष्पादित नहीं होती है। कम से कम कि कैसे यह यहाँ काम किया :-) है
nohillside

1
पैट्रिक्स, प्रतिक्रिया के लिए धन्यवाद। यह काम किया, मैं जिस मुद्दे पर चल रहा था, वह do shell scriptAppleScript में एक कमांड में चलने के बाद से मैं उद्धरणों से सही ढंग से बच नहीं पाया था ।
एलरोजिटो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.