2010-03-16 9 views
7

मैं एक ऐसी स्क्रिप्ट लिखने की कोशिश कर रहा हूं जो एक पैटर्न के लिए फ़ाइलों और greps के लिए निर्देशिका खोजता है। को छोड़कर को छोड़कर कुछ मिलता है, खोज अभिव्यक्ति अधिक जटिल होती है (विशेष निर्देशिका और फ़ाइलों को छोड़कर)।अंतिम बैश स्क्रिप्ट तर्क को हटा रहा है

#!/bin/bash 
if [ -d "${!#}" ] 
then 
    path=${!#} 
else 
    path="." 
fi 

find $path -print0 | xargs -0 grep "[email protected]" 

जाहिर है, ऊपर से काम नहीं करता क्योंकि "[email protected]" अभी भी पथ है। मैं सभी तर्कों से अधिक पुनरावृत्ति

args=${@%$path} 
find $path -print0 | xargs -0 grep "$path" 

या

whitespace="[[:space:]]" 
args="" 
for i in "${@%$path}" 
do 
    # handle the NULL case 
    if [ ! "$i" ] 
    then 
     continue 
    # quote any arguments containing white-space 
    elif [[ $i =~ $whitespace ]] 
    then 
     args="$args \"$i\"" 
    else 
     args="$args $i" 
    fi 
done 

find $path -print0 | xargs -0 grep --color "$args" 

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

# ./find.sh -i "some quoted string" 
grep: quoted: No such file or directory 
grep: string: No such file or directory 

ध्यान दें कि यदि [email protected] पथ शामिल नहीं है, पहले स्क्रिप्ट जो मैं चाहता क्या करता है।


संपादित: महान समाधान के लिए धन्यवाद! मैं जवाब के संयोजन के साथ चला गया:

#!/bin/bash 

path="." 
end=$# 

if [ -d "${!#}" ] 
then 
    path="${!#}" 
    end=$((end - 1)) 
fi 

find "$path" -print0 | xargs -0 grep "${@:1:$end}" 

उत्तर

8

संपादित करें:

मूल बस थोड़ा बंद किया गया था। यदि अंतिम तर्क निर्देशिका नहीं है तो कोई निष्कासन नहीं किया जाना चाहिए।

#!/bin/bash 
if [ -d "${!#}" ] 
then 
    path="${!#}" 
    remove=1 
else 
    path="." 
    remove=0 
fi 

find "$path" -print0 | xargs -0 grep "${@:1:$(($#-remove))}" 
+1

यह वास्तव में सुंदर है। –

+1

+1 मैंने आपके उत्तर से 2 चीजें सीखी हैं, और मैं बड़े पैमाने पर 10 से अधिक वर्षों तक बैश का उपयोग करता हूं – Tino

संबंधित मुद्दे