find
interpretiert einen Gedankenstrich am Anfang eines Dateinamens als Anfang einer Option. Die Verwendung des bekannten --
Tricks funktioniert nicht, da Optionen hinter dem Dateinamen stehen, das Anwenden hat keine Auswirkungen, und das Ersetzen des ersten Gedankenstrichs mit \-
funktioniert auch nicht. Benutzer werden oft dazu ermutigt, solchen Dateinamen mit ./
voranzukommen, aber was kann ich tun, wenn ich nicht weiß, ob der angegebene Pfad absolut oder relativ ist?
Bearbeiten: Eine Lösung ist find "$(readlink -f -- "$test_filename")"
, aber es ist hässlich. Irgendwelche besseren Ideen?
Bearbeiten 2 : Danke für die Vorschläge. Hier sind die zwei Skripts, die aus dieser Bemühung resultierten: safe-find.sh ; safe-count-files.sh
Dies mag ein bisschen billig erscheinen, aber ich empfehle die readlink
Abhilfe, die Sie herausgefunden haben. Nach dem Unix-Standard ,
Das erste Argument, das mit a beginnt "-" (...) und alle nachfolgenden Argumente soll als ein interpretiert werden Ausdruck
so --
wird in der Tat nicht funktionieren. Thkala's Lösung kann auch funktionieren, aber ich finde es weniger lesbar. Es kann jedoch schneller sein, wenn Sie eine Menge von find
-Aufrufen durchführen.
Hier ist ein Weg, der auf allen Unix-ähnlichen Systemen funktionieren sollte, ohne dass eine bestimmte Shell oder ein Nicht-Standard-Dienstprogramm benötigt wird¹.
%Vor%Wenn Sie eine Liste von Verzeichnissen in Ihren Positionsparametern haben und diese bearbeiten wollen, wird es etwas kompliziert. Hier ist eine POSIX sh Lösung:
%Vor% Bourne-Shells und andere Pre-POSIX sh-Implementierungen haben keine Arithmetik und set --
, es ist also ein bisschen hässlicher.
¹ readlink -f
ist verfügbar unter GNU (Linux, Cygwin usw.), NetBSD ≥4.0, OpenBSD ≥2.2, BusyBox. Es ist nicht verfügbar (außer Sie haben GNU-Tools installiert, und Sie haben sichergestellt, dass sie in Ihrem PATH
sind) unter Mac OS X (ab 10.6.4), HP-UX (ab 11.22), Solaris (ab OpenSolaris 200906), AIX (ab 7.1).
Verwenden Sie einen Glob, um den Bindestrich zu erfassen:
%Vor%edit: aktualisiert, um die Phrase regulärer Ausdruck zu entfernen und den Globe so zu zitieren, dass er von find, nicht von bash interpretiert wird (betrifft nur Randfälle).