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 f
im Argument der Option der Typ „Dateien“ (nicht „Verzeichnisse“) steht. Warum? (Wenn ich ls -ld
eines 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 -l
um 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 find
Verzeichnisse 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 -executable
Test ist für Verzeichnisse wahr, auf die Sie keinen Zugriff haben, und -prune
entfernt diese aus find
dem Suchbaum. Dadurch wird das Dienstprogramm daran gehindert, auf sie zuzugreifen. Auf diese Weise wird die Generierung von Berechtigungsfehlern vermieden.
Der -executable
Test (sowie die analogen -readable
und -writable
Tests) 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.