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 f
dazu führtfind
, dass die Übereinstimmung nicht mehr übereinstimmt./b
, obwohl-type l
die Übereinstimmung vorliegt? - Auf der Manualpage steht, dass es
-print
sich 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 -printf
hier ist gebunden an, -type f
weil „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