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 № 1Uż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
- foo Pasek OR na tej samej linii z grep;
globstar
opcja (w Bash> = 4)
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. :-)