2011-08-05 8 views
5

Używam -print0 do modyfikowania wyjścia find, aby używać terminali NULL zamiast nowych znaków. Jednak nie mogę tego uruchomić przy użyciu funkcji find -o (OR).Używanie -print0 z -o w znalezieniu

Działa to dobrze, to wypisuje listę nowej linii oddzielone plików, które nie są albo posiadanych przez użytkownika Pieter 'czy nie należąca do grupy „www-data”:

find . ! -user pieter -o ! -group www-data 

Ale kiedy dołączy -print0 do tego nie mam już wyjścia:

find . ! -user pieter -o ! -group www-data -print0 

to jednak działa dobrze:

find . ! -user pieter -print0 

Co ja jestem robiący wrażenie? Próbowałem dodać różne rozmieszczenia par nawiasów, ale bez skutku.

+0

Zgaduję, że to zadziała, ale nietestowane: "znajdź. \ (! -user pieter -o! -group www-data \) -print0' –

Odpowiedz

7

Brakuje ci parens. Należy pamiętać, że trzeba uciekać je więc powłoka przekazuje je na:

find . \(! -user pieter -o ! -group www-data \) -print0 

Możesz dowiedzieć się więcej o znalezienie on its man page, zwłaszcza w części dotyczącej przykładów.

Jeśli zastanawiasz się, dlaczego tak jest konieczne, to z powodu order of operations. Każde wyrażenie w find zwraca wartość true lub false. Jeśli nie wstawisz wyraźnego operatora (-a, -o lub ,) pomiędzy wyrażeniami, zakłada się, że jest to -a.

Tak, oryginalny komenda jest równoważna find . ! -user pieter -o ! -group www-data -a -print0, który będzie tylko oceniać print0 plików na posiadanych przez użytkownika pieter, ale nie grupa www-data.

+0

Świetnie! To działa. Ma to sens, teraz patrzę na twoje rozwiązanie, grupując warunki razem. – pfrenssen

Powiązane problemy