`find -type l` findet die Datei, `-type l -o -type f` nicht, aber nur mit explizitem `-print`

`find -type l` findet die Datei, `-type l -o -type f` nicht, aber nur mit explizitem `-print`

Ich verwende GNUs find.

Ich habe mein Problem auf diese Shell-Sitzung vereinfacht:

$ mkdir t
$ cd t
$ touch a 
$ ln -s a b
$ find -type l
./b
$ find -type l -o -type f
./a
./b
$ find -type l -print
./b
$ find -type l -o -type f -print
./a

Vielleicht liegt es daran, dass ich sehr müde bin, aber zwei Dinge sind mir unverständlich:

  • Ist es nicht so true OR false == true? Wie kann es sein, dass das Hinzufügen -o -type fdazu führt find, dass die Übereinstimmung nicht mehr übereinstimmt ./b, obwohl -type ldie Übereinstimmung vorliegt?
  • Auf der Manualpage steht, dass es -printsich dabei um den Standardausdruck handelt. Wie kann es also sein, dass eine Datei ausgedruckt wird, wenn sie nicht erwähnt wird, aber weggelassen wird, wenn sie erwähnt wird?

Dies passiert auch, wenn ich -printf(was ich eigentlich brauche) verwende; ich kann mir vorstellen, dass auch andere Ausdrücke davon betroffen sind.

Antwort1

In

find -type l -o -type f -print

Sie haben eine Aktion angegeben, daher gilt die Standardeinstellung nicht mehr. Aber -printfhier ist gebunden an, -type fweil „und“ eine höhere Priorität hat als „oder“. Sie können sich das als gleichwertig vorstellen mit

find \( -type l \) -o \( -type f -print \)

Um sowohl Links als auch Dateien auf die gleiche Weise zu verarbeiten, müssen Sie die Tests gruppieren:

find \( -type l -o -type f \) -print

verwandte Informationen