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