Find/Ausgabe
Ausgabe formatieren
gibt den vollständigen Pfadnamen der getesteten Datei auf die Standardausgabe
- -fprint Ausgabedatei
schreibt den Pfadnamen der getesteten Datei in die Ausgabedatei; wenn die Ausgabedatei nicht existiert, wird sie erzeugt, sonst wird sie erweitert; die Standardausgabe und die Standardfehlerausgabe werden als /dev/stdout und /dev/stderr angesprochen
- -fprint Datei
Gibt die gefunden Dateinamen nicht auf die Standardausgabe (Bildschirm) aus, sondern schreibt diese in die Datei "Datei"
- -print0
gibt den Pfadnamen der getesteten Datei, von einem Nullbyte abgeschlossen, auf die Standardausgabe; auf diese Weise können auch Pfadnamen korrekt weiterverarbeitet werden, die ein Zeilenende enthalten
- -fprint0 Ausgabedatei
schreibt den Namen der getesteten Datei in die Ausgabedatei und schließt die Ausgabe mit einem Nullbyte ab, wie -print0
- -printf
Using the (non-standard) “‑printf” action instead of the default “‑print” is useful to control the output format better than you can with the ls or dir utilities.
- You can use find with the ‑printf action to produce output that can easily be parsed by other utilities or imported into spreadsheets or databases.
- See the Gnu find man page for the dozens of possibilities with the ‑printf action.
- In fact, find with ‑printf is more versatile than ls; it is the preferred tool for forensic examiners even on Windows systems, to list file information.</nowiki>
- For example the following displays non-hidden (no leading dot) files in the current directory only (no subdirectories), with an custom output format: find . -maxdepth 1 -name '[!.]*' -printf 'Name: %16f Size: %6s\n'
“‑maxdepth” is a Gnu extension.
- On a modern, POSIX version of find you could use this: find . -path './*' -prune ...
- On any version of find you can use this more complex (but portable) code: find . ! -name . -prune ...
- which says to “prune” (don't descend into) any directories except “.”.
- Note that “‑maxdepth 1” will include “.” unless you also specify “‑mindepth 1”.
- A portable way to include “.” is: find . \( -name . -o -prune \) ...
- The “\(” and “\)” are just parenthesis used for grouping, and escaped from the shell.
- The “‑o” means Boolean OR.
- As a system administrator, you can use find to locate suspicious files (e.g., world writable files, files with no valid owner and/or group, Set files, files with unusual permissions, sizes, names, or dates).
- Here's a more complex example (which I saved as a shell script so I can run it often): find / -noleaf -wholename '/proc' -prune \ -o -wholename '/sys' -prune \ -o -wholename '/dev' -prune \ -o -wholename '/windows-C-Drive' -prune \ -o -perm -2 ! -type l ! -type s \ ! \( -type d -perm -1000 \) -print
- This says to seach the whole system, skipping the directories /proc, /sys, /dev, and /windows-C-Drive (presumably a Windows partition on a dual-booted computer).
- The Gnu ‑noleaf option tells find not to assume all remaining mounted filesystems are Unix file systems (you might have a mounted CD for instance).
- The “‑o” is the Boolean OR operator, and “!” is the Boolean NOT operator (applies to the following criteria).
- So these criteria say to locate files that are world writable (“‑perm ‑2”, same as “‑o=w”) and NOT symlinks (“! ‑type l”) and NOT sockets (“! ‑type s”) and NOT directories with the sticky (or text) bit set (“! \( ‑type d ‑perm ‑1000 \)”).
(Symlinks, sockets, and directories with the sticky bit set, are often world-writable and generally not suspicious.)
- -printf Format
gibt für die getestete Datei die Zeichenkette Format auf der Standardausgabe aus; Format kann verschiedene Sonderzeichen und Platzhalter enthalten, die von find bearbeitet werden:
\aAlarmton \bRückschritt \cAbbruch der Ausgabe \fSeitenvorschub \nZeilenvorschub \rWagenrücklauf \thorizontaler Tabulator \vvertikaler Tabulator \\der Backslash selbst
- ein Backspace gefolgt von irgendeinem anderen Zeichen wird als normales Zeichen interpretiert und einfach ausgegeben
%% das Prozentzeichen selbst %a die Zeit des letzten Zugriffs auf die Datei, in dem Format der ctime Funktion %A k die Zeit des letzten Zugriffs auf die Datei, in dem von k bestimmte Format; k hat dabei das gleiche Format wie der entsprechende Parameter der strftime Funktion in C:
@ Sekunden seit dem 1.1.1970 0 Uhr GMT H Stunde (00 bis 23) I Stunde (01 bis 12) k Stunde (0 bis 23) l Stunde (1 bis 12) M Minute (00 bis 59) p PM oder AM r Zeit, 12 Stunden (hh:mm:ss: AM/PM) S Sekunden (00 bis 61) T Zeit, 24 Stunden (hh:mm:ss) X Zeit (H:M:S) Z Zeitzone, oder nichts a abgekürzter Wochentag A ausgeschriebener Wochentag b abgekürzter Monatsname B ausgeschriebener Monatsname c Datum und Zeit d Tag im Monat D Datum (mm/dd/yy) h das gleiche wie b j der Tag im Jahr m die Zahl des Monats U die Nummer der Woche, Sonntag als erster Wochentag w die Zahl des Wochentags W die Nummer der Woche, Montag als erster Wochentag x Datum (mm/dd/yy) y die letzten beiden Stellen der Jahreszahl Y die Jahreszahl
%b die Dateigröße in 512 Byte Blöcken (aufgerundet) %c das Datum der letzten Statusänderung im Format der C ctime Funktion %Ck das Datum der letzten Statusänderung im Format der BR strftime " Funktion; Parameter wie oben" %d die Höhe der Datei im Verzeichnisbaum; Null bedeutet, dass die Datei Kommandozeilenargument ist
%f der Name der getesteten Datei, ohne Verzeichnisse
%g der Gruppenname der getesteten Datei oder die Kennzahl, wenn die Gruppe nicht eingetragen ist
%G die Gruppenkennzahl
%h die Verzeichnisnamen des Pfadnamen der getesteten Datei
%H das Kommandozeilenargument (Test), mit dem die Datei gefunden wurde
%i die Nummer der Inode der getesteten Datei
%k die aufgerundete Größe der getesteten Datei in Kilobytes
%l das Objekt, auf die ein symbolischer Link zeigt; leer, wenn die getestete Datei kein symbolischer Link ist
%m die Zugriffsrechte als Oktalzahl
%n die Anzahl der harten Links auf die getestete Datei
%p der Pfadname der Datei
%P der Pfadname und das Kommandozeilenargument (Test), mit dem die Datei gefunden wurde
%s die Größe der getesteten Datei in Bytes
%t die Zeit der letzten Änderung, im ctime Format
%Tk die Zeit der letzten Änderung, im strftime Format (siehe oben)
%u der Name des Eigentümers der getesteten Datei oder die Kennzahl, wenn der Benutzer nicht eingetragen ist
%U die Benutzerkennzahl des Eigentümers der getesteten Datei
- -fprintf Ausgabedatei Format
schreibt den Namen der getesteten Datei in die Ausgabedatei und benutzt dabei das Format mit Sonderzeichen wie bei printf
- -prune
Wenn die Datei ein Verzeichnis ist, wird nicht in dieses hinabgestiegen. * wahr, wenn die Option -depth nicht angegeben ist
- falsch, wenn die Option -depth angegeben ist, hat keine Auswirkungen.
- Beispiele
Ohne weitere Angaben gibt find die Namen der gefundenen Dateien aus: find /boot/grub/ -name "he*" /boot/grub/hexdump.mod /boot/grub/hello.mod /boot/grub/help.mod
- Wie bereits gesehen kann man mit -ls eine detailliertere Ausgabe erzeugen: find /boot/grub/ -name "he*" -ls 168624 4 -rw-r--r-- 1 root root 3196 Jan 13 17:08 /boot/grub/hexdump.mod 168603 4 -rw-r--r-- 1 root root 1308 Jan 13 17:08 /boot/grub/hello.mod 168623 4 -rw-r--r-- 1 root root 2200 Jan 13 17:08 /boot/grub/help.mod
- Mit -exec und dessen Varianten lassen sich beliebige Programme auf den Fundstellen ausführen.
- Die Anzahl der Zeilen in Textdateien findet man mit wc -l DATEI; kombiniert mit find sieht das so aus: </nowiki>
find -name "*.py" -exec wc -l {} \; 10 ./x/abc.py 6 ./x/date-form.py 102 ./x/download.py
- Das Kommando wc -l (Anzahl der Zeilen zählen) wird auf jede gefundene Datei angewandt.
- Die geschweiften Klammern werden durch die von find gefundenen Namen ersetzt.
- Am Ende muss der ganze Befehl mit einem Semikolon abgeschlossen werden.
- Damit das Semikolon nicht von der Shell interpretiert wird, muss man es mit einem Backslash oder Anführungsstrichen maskieren.
- Kombination mit -print find tmp -name "a" -exec touch {} \; -print ./tmp/a ./tmp/a/a ./tmp/a/a/a
touch setzt das Datum der Dateien auf den Ausführungszeitpunkt.
- Da touch aber nicht den Dateinamen ausgibt sieht man nicht, welche Dateien nun betroffen waren.
- Daher schickt man ein -print hinterher.