Find-Test und Bash-Test liefern nicht das gleiche Ergebnis. Warum?

Find-Test und Bash-Test liefern nicht das gleiche Ergebnis. Warum?

In meiner vorherigen FrageWie ersetzt man in find -exec die aktuelle Datei durch {}?, ich habe nach einem Test mit gefragt find. Ich möchte alle Dateien finden, die mir nicht gehören. Es gibt also einen richtigen Suchbefehl:

find . -type f ! -user "$USER"

aber das sollte auch für dieses hier gelten:

find . -type f -exec bash -c '
    for pathname do
        [[ ! -O "$pathname" ]] && printf "%s\n" "$pathname"
    done' bash {} +

beide führen jedoch zu unterschiedlichen Ergebnissen.

1) wenn ich das tue [command one] | wc -c--> 4121

Aber: [command two] | wc -c--> 236768 (PS: Ich suche Dateien in meinem $HOME).

Beide geben unterschiedliche Zahlen an, wie viele Dateien sie gefunden haben.

2) Beide liefern noch Ergebnisdateien, dieVerzeichnisse(ja, Verzeichnisse gehören mir nicht und daher - Berechtigung verweigert). Sie geben Verzeichnisse an, obwohl find . -type fim Argument der Option der Typ „Dateien“ (nicht „Verzeichnisse“) steht. Warum? (Wenn ich ls -ldeines dieser Verzeichnisse habe, gibt es weder einen Link noch sonst etwas.)

Antwort1

Hmm ..., in meinem Homedir funktionieren beide Befehle gleich. 8-/

Trotzdem sollten Sie den Standardfehler nach /dev/null umleiten und verwenden, wc -lum die Ausgabe korrekt zu zählen.

find . -type f ! -user "$USER" 2>/dev/null | wc -l
find . -type f -exec bash -c '
    for pathname do
        [[ ! -O "$pathname" ]] && printf "%s\n" "$pathname"
    done' 2>/dev/null bash {} + | wc -l

Von hier aus können Sie die Ergebnisse in Textdateien umleiten und die Dateien vergleichen, um nach Unterschieden zu suchen.

find . -type f ! -user "$USER" 2>/dev/null > /tmp/file_1.txt
find . -type f -exec bash -c '
    for pathname do
        [[ ! -O "$pathname" ]] && printf "%s\n" "$pathname"
    done' 2>/dev/null bash {} + >/tmp/file_2.txt
diff /tmp/file_{1,2}.txt

Wenn es Unterschiede gibt, nehmen Sie einige der überzähligen Dateien von /tmp/file_2.txt und untersuchen Sie weiter, warum die Datei nicht als „Wahr, wenn die Datei existiert und der effektiven Benutzer-ID gehört“ betrachtet wird.

Antwort2

Um zu vermeiden, dass Sie findVerzeichnisse aufrufen müssen, auf die Sie eigentlich keinen Zugriff haben, können Sie Folgendes verwenden ! -executable -prune:

find . ! -executable -prune -type f ! -user "$USER"

Der negierte -executableTest ist für Verzeichnisse wahr, auf die Sie keinen Zugriff haben, und -pruneentfernt diese aus finddem Suchbaum. Dadurch wird das Dienstprogramm daran gehindert, auf sie zuzugreifen. Auf diese Weise wird die Generierung von Berechtigungsfehlern vermieden.

Der -executableTest (sowie die analogen -readableund -writableTests) sind nicht standardisiert und erfordern GNU find.

Zu den Unterschieden im Ergebnis kann ich (noch) nichts sagen, da Sie dazu nichts gesagt haben. Da die Ausgabe so stark in der Größe variiert, sollte es trivial sein, Fälle zu finden und zu untersuchen, in denen ein Befehl etwas gefunden hat, was der andere Befehl nicht gefunden hat.

verwandte Informationen