Nie rozumiem skryptu -printf

0

Przejęłem odpowiedzialność za skrypty RHEL5 i nie miałem żadnego szkolenia na tej platformie ani skryptu bash. Jest skrypt, który ma wiele elementów, a ja zapytam tylko o drugi kawałek, ale pokażę ci również pierwszy, ponieważ myślę, że to pomoże w moim pytaniu poniżej.

Pierwsza część skryptu pokazuje dane wyjściowe użytkowników na określonym serwerze:

cut -d : -f 1 /etc/passwd

Wynik będzie wyglądał mniej więcej tak:

root
bin
joe
rob
other...

Drugi skrypt wymaga ode mnie wypełnienia każdego konta wymienionego w powyższym skrypcie i uruchomienia. Z tego, co mogę zebrać, i z moich wyszukiwań na stronach podręcznika i innych wyszukiwań, wychodzi i znajduje właściciela grupy pliku lub katalogu i oczywiście sortuje i wybiera tylko unikalne rekordy, ale nie jestem do końca pewien - więc to moje pytanie , co tak naprawdę robi poniższy skrypt? (Zabawne jest to, że jeśli podłączę każdą nazwę z powyższego wyjścia, czasami otrzymuję komunikat „nie mogę znaleźć nazwy użytkownika bla, bla, bla”).

findusername-printf %G | sort | uniq

jerzdevs
źródło

Odpowiedzi:

1

Jeśli spojrzysz na findstronę manuala, znajdziesz opis -printfopcji:

   -printf format
          True; print format on the standard output, interpreting `\' escapes
          and `%' directives...

Jeśli spojrzysz w dół strony podręcznika, znajdziesz dokumentację dla %G:

          %G     File's numeric group ID.

Znajduje więc wszystkie pliki zawarte w katalogu o nazwie username(w twoim przykładzie) i drukuje identyfikator grupy numerycznej, który jest ich właścicielem. To jest przesyłane potokowo sort, co posortuje je leksykalnie. Wyniki sortpobierania do potoku uniq, który usunie zduplikowane wpisy.

W ten sposób powstaje lista wszystkich unikalnych identyfikatorów grup, które posiadają pliki w określonym drzewie katalogów.

Jak napisano, nie zrobi tego dokładnie, ponieważ nie ma ograniczników. Jeśli masz pliki należące do grupy 200i 100, dane wyjściowe wyglądałyby następująco:

100200

... co oznacza, że sortzobaczy tylko jedną linię i nic nie zrobi.

Można dodać nowy wiersz do ciągu formatu, aby to naprawić:

find username -printf '%G\n' | ...
Larsks
źródło