finde im Verzeichnis, das mit Bindestrich beginnt

8

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

    
l0b0 26.11.2010, 14:23
quelle

4 Antworten

3

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.

    
Fred Foo 26.11.2010, 14:46
quelle
5

Wenn es in einem Skript ist, können Sie immer danach suchen. Z.B. für bash, ksh oder zsh:

%Vor%

In einer knapperen Form (für bash, ksh93 oder zsh):

%Vor%

Sie können dies sogar mit den Parametern eines Skripts tun, wenn sie alle Verzeichnisse sein sollen:

%Vor%     
thkala 26.11.2010 14:42
quelle
2

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.

%Vor%

¹ 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).

    
Gilles 27.11.2010 12:49
quelle
0

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).

    
Alex Brown 26.11.2010 16:39
quelle

Tags und Links