Was führt zu einem inkonsistenten bedingten Suchergebnis?

Was führt zu einem inkonsistenten bedingten Suchergebnis?

Ich schreibe ein kleines Skript, das verschiedene Dateistatistiken zu zwei verschiedenen Dateierweiterungen (*.parquet ODER *.metadata) in einem beliebigen Verzeichnis abruft. Ich muss diese Dateistatistiken nur von Dateien abrufen, die innerhalb der letzten 24 Stunden geändert/erstellt wurden.

TD=${1:-`pwd`}
find $TD -maxdepth 1 -type f -mtime -1 -name "*.parquet" -o -name "*.metadata" | wc -l
find $TD -maxdepth 1 -type f -mtime -1 -name "*.parquet" | wc -l
find $TD -maxdepth 1 -type f -mtime -1 -name "*.metadata" | wc -l

Die erste Zeile gibt aus60540

Die zweite Zeile gibt430

Die dritte Zeile gibt aus430

Die erwartete Ausgabe ist, dass die erste Zeile die Summe der zweiten und dritten Zeile ist (oder dass die zweite und dritte Zeilefirstline / 2

Ich versuche, alle Dateien aufzulisten, die entweder mit der Erweiterung .parquet ODER .metadata enden, und die Gesamtzahl der Dateien für beide Erweiterungen, die Gesamtdateigröße für jede Erweiterung, die durchschnittliche Dateigröße für jede Erweiterung und die Summe aller Dateigrößen zu zählen.

Die Statistiken zu finden ist einfach, nur die Auflistung der Dateien verwirrt mich. Was mache ich falsch?

Antwort1

Ihr Problem wird durch die Operatorpriorität verursacht. Da alle Ausdrücke ohne logische Operationen zwischen implizit mit verknüpft sind -a, das Assoziationen mit höherer Priorität als annimmt -o, ist Ihr kombinierter Ausdruck gleichbedeutend mit:

find $TD \( -maxdepth 1 -a -type f -a -mtime -1 -a -name "*.parquet" \) -o -name "*.metadata" | wc -l

Das bedeutet, dass Sie alle normalen Dateien im Suchverzeichnis finden, die in den letzten 24 Stunden mit dem Namen geändert wurden *.parquet, sowie alle Dateien/Verzeichnisse/Sockets usw., die sich irgendwo im Suchverzeichnisbaum befinden, irgendwann geändert wurden und den Namen haben *.metadata. Sie benötigen dazu:

find $TD -maxdepth 1 -type f -mtime -1 \( -name "*.parquet" -o -name "*.metadata" \) | wc -l

verwandte Informationen