Jeśli chcesz coś na plik, musisz użyć grep
na plik, coś w stylu:
$ find /home/somepath -type f -name '*.xml' | \
> while read path; do \
> grep -E -H -m 1 -o -Z "<tag>(.*)</tag>" "$path" || echo -e "$path\x00NULL"; \
> done
Rozbijam to:
$ find /home/somepath -type f -name '*.xml' -print | \
To generuje listę plików do przeszukania i umieszcza je w while
. Jedyne, co musi zrobić, to wydrukować jedną ścieżkę na linię, więc jest wiele sposobów, aby to zrobić.
> while read path;do \
Odczytuje każdą linię do path
zmienna powłoki i pętle do read
zwraca false
, co robi, gdy osiągnie koniec pliku, co robi, gdy find
wygenerował wszystkie ścieżki, do których chce dotrzeć.
> grep -E -H -m 1 -o -Z "<tag>(.*)</tag>" "$path" || echo -e "$path\x00NULL"; \
Przeszukuje bieżący plik (w $path
). Jeśli wzorca nie ma w pliku, grep
zwraca false
(tzn. wychodzi z niezerowym kodem wyjścia), więc echo
jest wykonywany. The -e
mówi, aby interpretować ucieczki, więc echo
wydrukuje bieżącą ścieżkę, ASCII nul
i dosłowny NULL
. To naśladować grep
wyjście, które będzie bieżącą ścieżką (wymuszone przez -H
, bycie grep
normalnie nie wyprowadzałby ścieżki podczas przeszukiwania pojedynczego pliku), ASCII nul
(z powodu -Z
) i dopasowany tekst.
> done
Zamyka while
pętla.
||
dotyczy całegogrep
polecenie, więcprintf
zostanie wykonane tylko, jeśligrep
zwraca wartość niezerową, którą zrobi tylko wtedy, gdy Nie dopasowania plików.