मैं एक ऐसी स्क्रिप्ट लिखने की कोशिश कर रहा हूं जो एक पैटर्न के लिए फ़ाइलों और 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}"
यह वास्तव में सुंदर है। –
+1 मैंने आपके उत्तर से 2 चीजें सीखी हैं, और मैं बड़े पैमाने पर 10 से अधिक वर्षों तक बैश का उपयोग करता हूं – Tino