Como o implícito e ( -a
) tem precedência mais alta que o -o
, o lado direito do -o
na primeira expressão é tomado como uma unidade em relação ao Operação ou , isto é:
\( -type f ! -exec fuser -s {} \; \) -o \( -type d -empty \) -print
age da mesma forma:
\( -type f ! -exec fuser -s {} \; \) -o \( -type d -empty -print \)
Portanto, para arquivos, ele executa fuser
e, para diretórios, ele imprime seus nomes.
O segundo:
\( \( -type f ! -exec fuser -s {} \; \) -o \( -type d -empty \) \) -print
tem parênteses explícitos, mas você não precisa dos internos, isso é igual:
\( -type f ! -exec fuser -s {} \; -o -type d -empty \) -print
E ele deve imprimir todos os diretórios e arquivos vazios para os quais fuser
retorna um valor falso (! = 0, invertido pelo !
).
No terceiro, você tem ... -empty {} ...
, em que {}
é usado como nome do caminho e a mensagem de erro informa qual é o problema.