एक निर्देशिका है जिसमें संख्याओं के नाम वाले फ़ोल्डर हैं, मुझे उस निर्देशिका में सबसे बड़ी संख्या वाला फ़ोल्डर ढूंढना है। यह वह स्क्रिप्ट है जिसे मैंने उस फ़ोल्डर को खोजने के लिए लिखा है:

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
-2
user14602825 15 पद 2020, 16:10

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 जोड़ने की सूचना। यह आपके सिस्टम को स्क्रिप्ट को बैश शेल में चलाने के लिए कहेगा।

1
John Kugelman 15 पद 2020, 20:14

क्या 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 : ...
0
Paul Hodges 15 पद 2020, 18:57

इसके बजाय ढूंढें का प्रयोग करें:

find . -maxdepth 1 -type d -regextype "posix-extended" -regex "^.*[[:digit:]]+.*$" | sort -n | tail -1

केवल इस निर्देशिका के भीतर निर्देशिकाओं की जांच करने के लिए अधिकतम गहराई को 1 पर सेट करें और गहरा नहीं। नियमित अभिव्यक्ति प्रकार को पॉज़िक्स-विस्तारित पर सेट करें और उन सभी निर्देशिकाओं की खोज करें जिनमें एक या अधिक अंक हों। टेल -1 के साथ सबसे बड़ा लेने से पहले परिणाम और क्रम को क्रमबद्ध करें।

0
Raman Sailopal 15 पद 2020, 16:27

आप बैकटिक्स files='ls path/' के बजाय सिंगल कोट्स का उपयोग कर रहे हैं। यह इसका मूल्यांकन करने के बजाय इसे शाब्दिक स्ट्रिंग के रूप में उपयोग करने का प्रयास कर रहा है। साथ ही, उस विशिष्ट कार्य के लिए, आप बस यह कर सकते हैं:

ls test | awk '{if($1 > largest){largest = $1}} END{print largest}'

इसे थोड़ा आसान बनाने के लिए।

1
recette 15 पद 2020, 16:27