[ -f /*.txt ]
यदि कोई एक (और केवल एक) गैर-छुपी हुई फ़ाइल /
जिसका नाम समाप्त होता है, .txt
और यदि वह फ़ाइल एक नियमित फ़ाइल है या एक नियमित फ़ाइल के लिए सिम्लिंक है, तो केवल तभी वापस आएगा ।
ऐसा इसलिए है क्योंकि वाइल्डकार्ड कमांड (यहां [
) में पारित होने से पहले शेल द्वारा विस्तारित किए जाते हैं ।
अगर वहाँ एक है तो /a.txt
और /b.txt
, [
5 तर्क पारित हो जाएगा: [
, -f
, /a.txt
, /b.txt
और ]
। [
फिर शिकायत करेंगे कि -f
बहुत सारे तर्क दिए जाते हैं।
आपको लगता है कि जाँच करना चाहते हैं *.txt
पैटर्न कम से कम एक गैर छिपा फ़ाइल (नियमित या नहीं) के लिए विस्तारित:
shopt -s nullglob
set -- *.txt
if [ "$#" -gt 0 ]; then
./script "$@" # call script with that list of files.
fi
# Or with bash arrays so you can keep the arguments:
files=( *.txt )
# apply C-style boolean on member count
(( ${#files[@]} )) && ./script "${files[@]}"
shopt -s nullglob
है bash
विशिष्ट है, लेकिन गोले की तरह ksh93
, zsh
, yash
, tcsh
बराबर बयान है।
ध्यान दें कि यह निर्देशिका की सामग्री को पढ़कर उन फ़ाइलों को ढूँढता है, यह उन फ़ाइलों की कोशिश नहीं करता है और उन सभी तक पहुँच प्राप्त करता है जो इसे समाधानों की तुलना में अधिक कुशल बनाता है जो शेल द्वारा गणना की गई फ़ाइलों की तरह ls
या stat
उस सूची पर आदेशों को कहते हैं ।
मानक sh
समतुल्य होगा:
set -- [*].txt *.txt
case "$1$2" in
('[*].txt*.txt') ;;
(*) shift; script "$@"
esac
समस्या यह है कि बॉर्न या पोसिक्स गोले के साथ, यदि कोई पैटर्न मेल नहीं खाता है, तो यह अपने आप फैलता है। इसलिए अगर इसका *.txt
विस्तार होता है *.txt
, तो आप नहीं जानते कि क्या यह है क्योंकि .txt
निर्देशिका में कोई फ़ाइल नहीं है या क्योंकि वहाँ एक फ़ाइल कहा जाता है *.txt
। उपयोग [*].txt *.txt
करने से दोनों के बीच भेदभाव करने की अनुमति मिलती है।
/
? इसके अलावा, आप पहले एक अर्धविराम याद कर रहे हैंfi
।