/ / Rekurencyjne wyszukiwanie i wyprowadzanie łańcucha z plików w hierarchii katalogów - linux, bash, shell, scripting

Rekursywnie szukaj i wypisz ciąg znaków z plików w hierarchii katalogów - linux, bash, shell, scripting

Jak napisać skrypt powłoki, aby przejść przez wszystkiepodkatalogi znajdujące się pod danym katalogiem iw każdej z tych podkatalogów wyszukują plik o nazwie "copyright" dla ciągów takich jak "license" lub "GPL" i drukują linie z tymi podciągami. Po uruchomieniu tego powinienem być w stanie powiedzieć, jakie były wyniki dla każdego znalezionego pliku praw autorskich.

Odpowiedzi:

1 dla odpowiedzi № 1

Użyj find z -exec:

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

1 dla odpowiedzi nr 2

Za pomocą grep i Bash ** (globstar, dla głębokiej ekspansji):

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

Wyjaśnienie

  • globstar:

Jeśli jest ustawiony, wzorzec ** używany w nazwie ścieżkikontekst rozszerzenia będzie dopasuj wszystkie pliki i zero lub więcej katalogów i podkatalogów. Jeśli po wzorcu następują tylko /, tylko katalogi i podkatalogi mecz.

  • -E, --extended-regexp:

Interpretować PATTERN jako rozszerzone wyrażenie regularne (ERE, patrz poniżej). (-E jest określone przez POSIX.)

Referencje


0 dla odpowiedzi № 3

Oto rodzaj żenującego skryptu, którego używam do tworzenia "Raportu o licencji" dla hosta FreeBSD. Zrobiłem to szybciej, wyłączając xargs dla anubhava -exec. Dzięki!

#!/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 "nn------------------------------------------------------------------------- nn"

done

Projekt RSN na jeden dzień: przepisz w Perlu i utwórz "POSIX cross platform" dla różnych systemów pakowania za pomocą wtyczek. :-)