Was ist der Unterschied zwischen finden. und finde . -drucken

27

Was ist der Unterschied zwischen:

find .

und

find . -print

Was macht -printeigentlich?

$ find .
.
./hello.txt
./hello
./hello/txt
./hello/hello2
./hello/hello2/hello3
./hello/hello2/hello3/txt
./hello/hello2/txt
$ find . -print
.
./hello.txt
./hello
./hello/txt
./hello/hello2
./hello/hello2/hello3
./hello/hello2/hello3/txt
./hello/hello2/txt
faressoft
quelle

Antworten:

41

Aus der findutils findManpage :

Wenn kein Ausdruck angegeben wird, wird der Ausdruck -printverwendet (aber Sie sollten wahrscheinlich -print0trotzdem in Betracht ziehen, stattdessen zu verwenden).

( -printIst ein findAusdruck.)

Die POSIX-Dokumentation bestätigt dies:

Ist kein Ausdruck vorhanden, wird -print als Ausdruck verwendet.

Ist find .also genau gleichbedeutend mit find . -print; Der erste hat keinen Ausdruck, -printwird also intern hinzugefügt.

Die Erklärung dazu finden Sie -printweiter unten auf der Hilfeseite:

-print

Wahr; Drucken Sie den vollständigen Dateinamen in der Standardausgabe, gefolgt von einer neuen Zeile. Wenn Sie die Ausgabe von find in ein anderes Programm leiten und die geringste Wahrscheinlichkeit besteht, dass die gesuchten Dateien eine neue Zeile enthalten, sollten Sie ernsthaft in Betracht ziehen, die -print0Option anstelle von zu verwenden -print. Informationen zum Umgang mit ungewöhnlichen Zeichen in Dateinamen finden Sie im Abschnitt UNUSUAL FILENAMES.

Stephen Kitt
quelle
Eine Art Anfängerfrage, aber wovon sprichst du? ist das ein regulärer Ausdruck?
Rishi Prakash
2
@ Rishi siehe die Manpage .
Stephen Kitt
20

-printist die Standard - Aktion . Einige findPrädikate werden als Aktionen im Gegensatz zu Filtern oder Bedingungen betrachtet . Zum Beispiel -type fist keine Aktion. -execist eine Aktion, obwohl sie auch als Bedingung verwendet werden kann.

Die Maßnahmen umfassen -print, -execund -ok. Einige findImplementierungen haben andere Nicht-Standard - Aktion Prädikate wie die -print0, -printf, -execdir, -okdir, -ls...

find files <some-predicates>

Wenn keine der <some-predicates>enthaltenen Aktionen äquivalent ist zu:

find files \( <some-predicates> \) -print

(Beachten Sie die obigen Klammern, die wichtig sind, wenn es einige -oOperatoren gibt).

Im Zweifelsfall ist es am besten, sie -printexplizit zu verwenden (oder -exec printf '%s\0' {} +(oder -print0wo verfügbar), damit die Ausgabe nachbearbeitet werden kann).

Die Standardaktion -printwird von POSIX festgelegt. Einige alte findImplementierungen erforderten eine explizite-print , aber diese sind heutzutage in der Regel nicht in der Natur zu finden.

Beachten Sie auch, dass bei einigen findImplementierungen das weggelassen werden fileskann. In diesem Fall wird standardmäßig im aktuellen Verzeichnis gesucht. Das heißt für sie

find

ist äquivalent zu

find .
find . -print

Das ist aber kein Standard, also wird es am besten vermieden.

Am ausführlicheren (und nützlicheren) Ende des Spektrums finderlauben einige Implementierungen auch die Übergabe von Dateipfaden als Argument an eine -fOption wie in:

find -f "$file1" -f "$file2" -print

Sie sind die einzigen findImplementierungen, an die beliebige Dateipfade übergeben werden können find. Andere Implementierungen akzeptieren keine Dateipfade wie !oder -print... und setzen daher find "$file" -print(oder sogar find -- "$file" -print) voraus, dass $filees sich nicht um den Namen eines findPrädikats (oder einer Option im ersten Fall) handelt.

Leider ist das weder Standard noch portabel.

Stéphane Chazelas
quelle
Wenn es nicht dem Standard entspricht und am besten vermieden wird, warum sollte man es überhaupt benennen?
Isaac
@Isaac, weil sie praktisch sein können / sind mögliche Tippfehler ...
vonbrand
8

Sie sind gleich, beide schreiben die gesamte Verzeichnishierarchie aus dem aktuellen Verzeichnis heraus.

In POSIX finden Sie Dokumentation :

Die folgenden Befehle sind äquivalent:

finden .

finden . -drucken

cuonglm
quelle
4

Unter Linux gibt es keinen Unterschied, aber andere Systeme (wie zum Beispiel AIX) benötigen ihn, -printwenn die Ausgabe des Befehls auf Ihrem Bildschirm angezeigt werden soll.

YoMismo
quelle
3
Das wären dann sehr sehr alte Versionen von AIX. AIX 4.3 findbenötigt es nicht. AIX ist seit Jahrzehnten POSIX-konform.
Stéphane Chazelas
3

Viele Jahre lang hatte der Befehl find keine Standardaktion. Ein häufiger Fehler war, zu vergessen, die Option -print zu Ihrem Suchbefehl hinzuzufügen. Ich schreibe es immer noch aus Gewohnheit.

Aber irgendwann wurde es so jetzt als Standardaktion hinzugefügt find .und find . -printsind gleichwertig.

Kevin
quelle
1

Es ist manchmal nützlich, diese Option -printexplizit zu verwenden, wenn Sie eine andere Aktion ausführen, damit der Dateiname angezeigt wird, während diese Aktion ausgeführt wird.

find . -print -delete

wäre ähnlich wie

rm -rfv *

wo -printentspricht -v. Wenn Sie nicht -printangeben, werden die Dateinamen nicht angezeigt.

Um den rmBefehl übrigens noch ähnlicher zu gestalten, geben Sie zuerst diesen Bash-Befehl aus

shopt -s dotglob

Dadurch werden die *Match-Dot-Dateien (ausgeblendet).

Bis auf weiteres angehalten.
quelle