2011-08-05 9 views
5

Estoy usando -print0 para modificar la salida de find para usar terminadores NULL en lugar de nuevas líneas. Sin embargo, no puedo hacer que esto funcione cuando uso la función -o (OR) de find.Usando -print0 con -o en find

Esto funciona bien, imprime una lista nueva línea separada de los archivos que, o bien no son propiedad de 'Pieter' usuario o no propiedad del grupo 'www-data':

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

Pero cuando añado -print0 a este consigo ninguna salida más:

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

sin embargo, esto funciona bien:

find . ! -user pieter -print0 

¿Qué soy yo m ¿emisión? He intentado agregar varias ubicaciones de pares de paréntesis, pero fue en vano.

+0

Supongo que esto funcionaría, pero no probado: 'find. \ (! -user pieter -o! -group www-data \) -print0' –

Respuesta

7

Te faltan los parientes. Tenga en cuenta que usted tiene que escapar de ellos por lo que la cáscara de los pasa:

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

Puede encontrar más información sobre encontrar on its man page, especialmente en la sección de ejemplos.

En caso de que se pregunte por qué es necesario, es por el order of operations. Cada expresión en find devuelve verdadero o falso. Si no coloca un operador explícito (-a, -o o ,) entre las expresiones, se supone -a.

Por lo tanto, el mandato original es equivalente a find . ! -user pieter -o ! -group www-data -a -print0, que sólo se evaluará print0 en ficheros titularidad de usuario pieter, pero no www-data grupo.

+0

¡Genial! Esto funciona. Tiene sentido ahora que veo tu solución, agrupando las condiciones. – pfrenssen

Cuestiones relacionadas