Im Allgemeinen bezeichnet die leere Zeichenfolge weder für Shell-Befehle noch für Systemaufrufe das aktuelle Verzeichnis. Dies war auf einigen älteren Systemen der Fall, jedoch nicht auf POSIX-kompatiblen Systemen .
Gelegentlich finden Sie ein Programm, das das aktuelle Verzeichnis verwendet, wenn Sie eine leere Zeichenfolge übergeben und das Programm einen Verzeichnisnamen erwartet. Dies ist manchmal absichtlich und manchmal ein Nebeneffekt, wenn dem absoluten Pfad des aktuellen Verzeichnisses vorangestellt wird, wenn die angegebene Zeichenfolge nicht mit einem Schrägstrich beginnt.
Das Beste für Sie wäre, das zu verlassen ./
. Es schadet nicht.
Wenn die Liste der Dateien für ist
find . … | sed 's!^\./!!'
Beachten Sie, dass dadurch einige Dateinamen, die Zeilenumbrüche enthalten, beschädigt werden. Dies ist normalerweise kein Problem für den menschlichen Verzehr, und die Ausgabe von find
ist nicht für den Programmverbrauch geeignet, da sie nicht eindeutig ist. Wenn Sie verwenden -print0
, was für den Programmverbrauch geeignet ist, ist Ihnen das ./
Präfix wahrscheinlich sowieso egal .
Sie können find * …
anstelle von verwenden find . …
, beachten Sie jedoch, dass find *
es eine Reihe von Fehlern gibt, die es im Allgemeinen ungeeignet machen:
.
wurde weggelassen.
- Alle
.
Punktdateien (Dateien, deren Name mit oder ..` beginnt ) werden weggelassen.
- Wenn sich im aktuellen Verzeichnis ein Dateiname befindet, dessen Name mit
-
(oder einer Datei mit dem Namen !
oder (
...) beginnt , wird dieser als Option oder Prädikat von interpretiert find
.
Der erste Punkt spielt keine Rolle, wenn Ihr Filter das aktuelle Verzeichnis ausschließt. Für den zweiten Punkt können Sie die Muster verwenden ..?* .[!.]* *
, um alle Dateien im aktuellen Verzeichnis abzugleichen. Sie müssen jedoch überprüfen, ob jedes Muster mit mindestens einer Datei übereinstimmt, und es weglassen, wenn dies nicht der Fall ist. Dies ist möglich, aber sehr umständlich. Der letzte Punkt ist ein Stopper. So find *
geeignet sein kann für Quickie Befehlszeile verwenden, aber Sie es nicht in einem Skript verwenden.
Ein alternativer Ansatz besteht darin, die rekursive Globbing-Funktion der Shell zu verwenden, z
printf '%s\n' **/*.h
Dies muss von shopt -s globstar
in bash und von set -o globstar
in ksh93 aktiviert werden und ist in einer grundlegenden POSIX-Shell wie dash nicht vorhanden. Punktdateien werden standardmäßig nicht durchlaufen. Um sie einzuschließen, lassen Sie das Globbing zuerst Punktdateien mit shopt -s dotglob
in bash oder FIGNORE='@(.|..)'
in ksh93 nicht ignorieren . Wenn keine Übereinstimmungen vorhanden sind, gibt dieser Befehl das Muster aus. Führen Sie shopt -s nullglob
in bash aus, um stattdessen eine leere Zeile zu drucken, und verwenden Sie das Muster ~(N)**/*.h
in ksh.
In zsh ist rekursives Globbing standardmäßig aktiviert. Verwenden Sie das Glob-Qualifikationsmerkmal D
, um Punktdateien einzuschließen und N
eine leere Zeile zu drucken, wenn keine Übereinstimmungen vorliegen (standardmäßig gibt zsh einen Fehler aus, wenn ein Muster keiner Datei entspricht). Sie können printf
wie oben oder verwenden
print -rl -- **/*.h(DN)
find
Mit dem Parameter -printf können Sie festlegen, wie die Ergebnisse angezeigt werden.find . -name '*.h' -printf '%P\n'
entfernt das./
Präfix. Sehen Sie, wasfind . -name '*.h' -print
tut.