Beispielsweise suche ich nach Dateien und Verzeichnissen in einem Verzeichnis:
ubuntu@example:/etc/letsencrypt$ sudo find . -name example.com*
./archive/example.com
./renewal/example.com.conf
./live/example.com
ubuntu@example:/etc/letsencrypt$
Wie kann ich das markieren ./archive/example.com
und ./live/example.com
sind die Verzeichnisse in der Ausgabe oben?
Antwort1
Drucken Sie den Dateityp zusammen mit dem Namen mit -printf "%y %p\n"
:
$ sudo find . -name 'example.com*' -printf "%y %p\n"
d ./archive/example.com
f ./renewal/example.com.conf
d ./live/example.com
Die Verwendung -printf
setzt GNU voraus find
(die gängigste find
Implementierung auf Linux-Systemen).
Antwort2
Zweimal finden:
echo 'directories'
find . -name 'example.com*' -type d
echo 'non-directories'
find . -name 'example.com*' ! -type d
Beachten Sie auch die Anführungszeichen des Musters, das für den Namenstest verwendet wird. Ohne Anführungszeichen würde die Shell versuchen, die Zeichenfolge mit Namen im aktuellen Verzeichnis abzugleichen, bevor sie aufruft find
. Wenn die failglob
Shell-Option in der Shell gesetzt war bash
oder wenn die NOMATCH
Shell-Option in zsh
nicht aufgehoben war, würde ein nicht in Anführungszeichen gesetztes Globbing-Muster, das mit nichts übereinstimmt, einen Fehler von der Shell erzeugen und find
überhaupt nicht aufgerufen werden.
Alternativ können Sie auch einfach einen Schrägstrich am Ende des Verzeichnispfadnamens ausgeben (so ls -p
würden Verzeichnisse dargestellt):
find . -name 'example.com*' \( -type d -exec printf '%s/\n' {} \; -o -print \)
Der obige find
Befehl prüft zunächst, ob der Name korrekt ist. Wenn dies der Fall ist und es sich um ein Verzeichnis handelt, wird printf
der Pfadname des Verzeichnisses mit einem Schrägstrich am Ende ausgegeben. Wenn dies nicht der Fall ist, -print
wird der Pfadname einfach so ausgegeben, wie er ist.
Mit GNU könnte find
das -exec printf '%s/\n' {} \;
Bit durch ersetzt werden -printf '%p/\n'
.
Mit Standard find
könnten Sie -exec printf '%s/\n' {} +
das externe Dienstprogramm auch so wenig wie möglich aufrufen printf
, aber das würde bedeuten, dass Verzeichnisse wahrscheinlich zuletzt oder zumindest stapelweise ausgegeben würden.
Eine weitere Alternative besteht darin, tatsächlich zu verwenden, ls -p
um Verzeichnisse von anderen Dateitypen zu unterscheiden. Bei Verwendung ls -p
würde ein Verzeichnis mit einem abschließenden Zeichen aufgelistet /
, genau wie oben.
find . -name 'example.com*' -exec ls -f -d -p {} +
Ich verwende -f
hier, um zu vermeiden, dass ls
die Ausgabe sortiert wird, und -d
um die Auflistung derInhaltvon Verzeichnissen.
Sie können ls -F
statt ls -p
auch verwendenandereMarkierungen für andere Dateitypen als Verzeichnisse. Ausführbare Dateien würden beispielsweise mit *
und symbolische Links mit versehen @
.
Sowohl -p
als auch -F
(und -f
und -d
) sind Standardoptionen für das ls
Dienstprogramm.
Antwort3
Sie können file
es so verwenden:
sudo find . -name "example.com*" -print0 | xargs -0 sudo file
Beispielausgabe:
$ sudo find . -name "example.com*" -print0 | xargs -0 sudo file
./example.com. big file: ASCII text
./example.com-dir: directory
./example.com: empty
Antwort4
Wenn Sie eine portablere Option wünschen, die mit *nix-Varianten ohne die GNU-Option funktioniert -printf
(z. B. macOS), können Sie am Ende der Verzeichnispfade wie ls
folgt einen Schrägstrich hinzufügen:
find . -name "example.com*" -exec ls -dF {} \;
Beispiel:
$ sudo find . -name "example.com*" -exec ls -dF {} \;
./archive/example.com/
./renewal/example.com.conf
./live/example.com/
Dies liegt zufällig auch in einem Format vor, das für die weitere Weiterleitung an weitere Unix-Befehle besser geeignet ist.