2016-06-12 6 views
0

Итак, у меня есть команда find, как показано ниже, которая находит файлы libclntsh.so.* в каталоге instantclient.Найти и софт-ссылку без родительского пути

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

Это приводит к примеру,

instantclient/libclntsh.so.11.1 

Как я теперь ln в instantclient каталоге, ln -s libclntsh.so.11.1 libclntsh.so все с find команды в сочетании с exec

Я должен упомянуть здесь, что мне делать НЕ хочу cd в instantclient. И это для Alpine Linux.

ответ

1

Используйте опцию -execdir. Согласно инструкции:

-execdir command {} ;

Как -exec, но указанная команда выполняется из подкаталога, содержащего согласованный файл, который не является обычно каталог, в котором вы начали поиск. Это гораздо более безопасный метод для вызова команд, поскольку он позволяет избежать условий гонки при разрешении путей к сопоставленным файлам.

Так что ваша команда будет:

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

EDIT:

Другое решение

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

вау. Благодарю. не знал, что существует. – nixgadgets

+0

И я тоже :) Я просто проверял, как работает '-exec', и нашел его на странице руководства. – Marki555

+0

Есть ли альтернатива этому? '-execdir' не существует в качестве опции в поиске Alpine Linux, поэтому, вероятно, я этого не видел. – nixgadgets