एक निर्देशिका है जिसमें संख्याओं के नाम वाले फ़ोल्डर हैं, मुझे उस निर्देशिका में सबसे बड़ी संख्या वाला फ़ोल्डर ढूंढना है। यह वह स्क्रिप्ट है जिसे मैंने उस फ़ोल्डर को खोजने के लिए लिखा है:
files='ls path/'
var=0
for file in $files
do
echo $file
tmp=$((file-"0"))
if [ $tmp -gt $var ]
then
var=$tmp
fi
done
echo $var
लेकिन यह काम नहीं कर रहा है। यह कमांड sudo ./restore2.sh
का उपयोग करके स्क्रिप्ट को लागू करने के बाद त्रुटि देता है।
ls
path/
./restore2.sh: line 6: path/: syntax error: operand expected (error token is "/")
0
4 जवाब
ये कोशिश करें:
#!/bin/bash
files=`ls path/`
var=0
for file in $files
do
echo $file
tmp=$((file-"0"))
if [ $tmp -gt $var ]
then
var=$tmp
fi
done
echo $var
यहाँ एक बैकटिक है: ls path/
सिंगल या डबल-कोट्स के बजाय। मैंने केवल इस कथन को ठीक किया है और यह काम कर गया है। और स्क्रिप्ट के शीर्ष पर #!/bin/bash
जोड़ने की सूचना। यह आपके सिस्टम को स्क्रिप्ट को बैश शेल में चलाने के लिए कहेगा।
क्या path/
में कोई फाइल है? ऐसा लगता है कि यह खाली है।
आपको पूरी तरह से अलग शिकायत चाहिए मिल रही होगी...
आप फ़ाइल नाम में पथ जानकारी नहीं चाहते हैं। इसे ${file##*/}
से अलग करने के बजाय, बस वहां जाएं और गैर-पथ वाले नामों का उपयोग करें।
अपने तर्क को आधार मानकर एक अनुकूलन -
cd /whatever/path/ # go where the files are
var=-1 # initialize comparator
for file in [0-9]* # each entry that starts with a digit
do [[ "$file" =~ [^0-9] ]] && continue # skip any file with nondigit contents
[[ -f "$file" ]] || continue # only process plain files
(( file > var )) && var=$file # remember largest seen
done
echo $var # report largest
यदि आप सुनिश्चित हैं कि कोई ऋणात्मक क्रमांकित फ़ाइल नाम नहीं होगा, तो ऐसा करना चाहिए।
यदि मान्य नकारात्मक हो सकते हैं, तो आपका आरंभीकरण उचित रूप से कम होना चाहिए, और गैर-अंकों के बहिष्करण में ऋण चिह्न, साथ ही चयन करने के लिए फ़ाइलों की सूची शामिल होनी चाहिए।
ध्यान दें कि यह पार्स नहीं करता ls
और इसके लिए sort
या किसी अन्य प्रक्रिया को जन्म देना -- यह सब bash
दुभाषिया में नियंत्रित किया जाता है और यह काफी कुशल होना चाहिए।
यदि आप अपने डेटा के बारे में सुनिश्चित हैं, और जानते हैं कि निर्देशिका में केवल 0
नाम की कोई नकारात्मक या फ़ाइल नहीं है या [0-9]*
पैटर्न से मेल खाने वाली गैर-सादा-फ़ाइल प्रविष्टियां नहीं हैं, तो आप इसे सरल बना सकते हैं अभी - अभी
cd /whatever/path/ # go where the files are
for file in [0-9]*; do (( file > var )) && var=$file; done
echo $var # report largest
एक तरफ, यदि आप "पहले एक सूची बनाएं" तर्क को संरक्षित करना चाहते हैं, तो आपको अभी भी ls
का उपयोग नहीं करना चाहिए। एक सरणी का प्रयोग करें।
cd /wherever/your/files/are/
files=( [0-9]* )
for file in "${files[@]}"
do : ...
इसके बजाय ढूंढें का प्रयोग करें:
find . -maxdepth 1 -type d -regextype "posix-extended" -regex "^.*[[:digit:]]+.*$" | sort -n | tail -1
केवल इस निर्देशिका के भीतर निर्देशिकाओं की जांच करने के लिए अधिकतम गहराई को 1 पर सेट करें और गहरा नहीं। नियमित अभिव्यक्ति प्रकार को पॉज़िक्स-विस्तारित पर सेट करें और उन सभी निर्देशिकाओं की खोज करें जिनमें एक या अधिक अंक हों। टेल -1 के साथ सबसे बड़ा लेने से पहले परिणाम और क्रम को क्रमबद्ध करें।
आप बैकटिक्स files='ls path/'
के बजाय सिंगल कोट्स का उपयोग कर रहे हैं। यह इसका मूल्यांकन करने के बजाय इसे शाब्दिक स्ट्रिंग के रूप में उपयोग करने का प्रयास कर रहा है। साथ ही, उस विशिष्ट कार्य के लिए, आप बस यह कर सकते हैं:
ls test | awk '{if($1 > largest){largest = $1}} END{print largest}'
इसे थोड़ा आसान बनाने के लिए।
संबंधित सवाल
नए सवाल
bash
बैश कमांड शेल के लिए लिखी गई लिपियों के बारे में प्रश्नों के लिए। त्रुटियों / वाक्यविन्यास त्रुटियों के साथ शेल स्क्रिप्ट के लिए, कृपया यहां पोस्ट करने से पहले शेलचेक प्रोग्राम (या वेब शेलचेक सर्वर पर https://shellcheck.net) के साथ उन्हें जांचें। बैश के इंटरैक्टिव उपयोग के बारे में सवाल स्टैक ओवरफ्लो की तुलना में सुपर उपयोगकर्ता पर ऑन-टॉपिक होने की अधिक संभावना है।