Рекурсивно искать и выводить строку из файлов в иерархии каталогов

Как написать сценарий оболочки, чтобы пройти через все подкаталоги под данным каталогом, и в каждом из этих подкаталогов искать файл под названием "copyright" для строк, таких как "лицензия" или "GPL", и печатать строки с такими подстроки. После запуска этого я должен быть в состоянии сообщить, какие результаты были получены для каждого найденного файла авторского права.

3 ответа

команда

Использование grep и Bash ** (globstar, для глубокого расширения):

shopt -s globstar; # enable ** support
grep -i -E 'licence|GPL' **/copyright

объяснение

  • globstar:

Если установлено, шаблон **, используемый в контексте расширения пути, будет соответствовать всем файлам и нулю или более каталогам и подкаталогам. Если за шаблоном следует /, только каталоги и подкаталоги совпадают.

  • -E, --Extended-regexp:

Интерпретировать PATTERN как расширенное регулярное выражение (ERE, см. Ниже). (-E указан POSIX.)

Рекомендации


Используйте find с -exec:

find . -name copyright -exec grep -H -e "license" -e "GPL" '{}' + >> results


Вот какой-то смущающий сценарий, который я использую для создания "Лицензионного отчета" для хоста FreeBSD. Я сделал это быстрее, отключив xargs для anubhava -exec. Благодарю!

#!/bin/sh
#
# pkg_license_check
#
# TODO: make this report on unlicensed packages.
#
LICENSES='MIT GPL ART BSD'

for LICENSE in $LICENSES
do

 cd /usr/local/share/licenses
 num='find . -name LICENSE -exec grep -e "$LICENSE" '{}' + | wc -l'
 echo "Total of $num $LICENSE Licensed packages as follows:"
 find . -name LICENSE -exec grep -e "$LICENSE" -e '{}' + | awk -F":" '{sub("^\.\/", "", $1); print "\n" $1 "\n" $2 $3}'
 echo -e "\n\n------------------------------------------------------------------------- \n\n"

done

Проект на один день RSN: переписать в perl и сделать "кросс-платформу POSIX" для разных упаковочных систем с использованием плагинов. :-)

licensed under cc by-sa 3.0 with attribution.