2016-06-12 25 views
0

So habe ich einen Suchbefehl wie folgt, die libclntsh.so.* Dateien in einem Verzeichnis instantclient findet.Suchen und Soft Link ohne den übergeordneten Pfad

find instantclient -type f -name "*libclntsh\.so\.[0-9]*\.[0-9]*" 

Daraus ergibt sich für zB

instantclient/libclntsh.so.11.1 

Wie ich jetzt ln innerhalb instantclient Verzeichnis, ln -s libclntsh.so.11.1 libclntsh.so alle mit einem find Befehl in Kombination mit exec

sollte ich hier erwähnen, dass ich tue NICHT wollen cd in instantclient. Und das ist für Alpine Linux.

Antwort

1

Verwenden Sie die Option -execdir. Wie pro Handbuch:

-execdir command {} ;

Wie -exec, aber der angegebene Befehl wird aus dem Unterverzeichnis enthält die angepassten Datei ausführen, die das Verzeichnis nicht normal ist, in dem Sie finden gestartet. Dies ist eine viel sicherere Methode zum Aufrufen von Befehlen, da es Rassenbedingungen während der Auflösung der Pfade zu den übereinstimmenden Dateien vermeidet.

Also Ihr Befehl lautet:

find instantclient -type f -name "*libclntsh\.so\.[0-9]*\.[0-9]*" -execdir ln -s {} libclntsh.so \; 

EDIT:

Eine andere Lösung

find instantclient -type f -name "*libclntsh\.so\.[0-9]*\.[0-9]*" | xargs -I {} sh -c 'ln -s $(basename {}) instantclient/libclntsh.so' 
+0

wow. Vielen Dank. Ich wusste nicht, dass es existiert. – nixgadgets

+0

Ich auch nicht :) Ich habe gerade überprüft, wie genau "-exec" funktioniert und fand es in der Manpage. – Marki555

+0

Gibt es eine Alternative dazu? '-execdir' existiert nicht als eine Option in der Suche von Alpine Linux, was wahrscheinlich ist, warum ich nicht gesehen habe. – nixgadgets