Я пытаюсь написать скрипт, который ищет в каталоге файлы и greps для шаблона. Что-то похожее на приведенное ниже , за исключением , выражение find гораздо сложнее (исключая отдельные каталоги и файлы).
#!/bin/bash
if [ -d "${!#}" ]
then
path=${!#}
else
path="."
fi
find $path -print0 | xargs -0 grep "$@"
Очевидно, что вышеприведенное не работает, потому что "$@"
по-прежнему содержит путь. Я пробовал варианты построения списка аргументов путем перебора всех аргументов для исключения пути, таких как
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
Обратите внимание, что если $@
не содержит путь, первый скрипт делает то, что я хочу.
РЕДАКТИРОВАТЬ : Спасибо за отличные решения! Я пошел с комбинацией ответов:
#!/bin/bash
path="."
end=$#
if [ -d "${!#}" ]
then
path="${!#}"
end=$((end - 1))
fi
find "$path" -print0 | xargs -0 grep "${@:1:$end}"