3

У меня есть каталог с файлами кода и исполняемыми файлами, и я хочу знать, как создать символическую ссылку только на исполняемые файлы в этом каталоге?

Я знаю, что path-of-directory/* выбирает все файлы, но мне нужны только исполняемые файлы.

3 ответа3

6

Вы можете использовать find для вывода списка исполняемых файлов:

find /foo -type f -executable 

Затем вы можете использовать опцию -exec для создания ссылки.

   -exec command ;
          Execute  command;  true  if 0 status is returned.  All following
          arguments to find are taken to be arguments to the command until
          an  argument  consisting of `;' is encountered.  The string `{}'
          is replaced by the current file name being processed  everywhere
          it occurs in the arguments to the command [...]

Итак, чтобы создать ссылку в ~/bar на каждый исполняемый файл в ~/foo , вы должны сделать

find ~/foo -type f -executable -exec ln -s {} ~/bar \;

Обратите внимание, что это не поиск двоичных файлов, а просто тех, у которых установлен исполняемый бит.

4

Другая возможность:

for i in ~/foo/*; do [ -x "$i" ] && ln -s "$i" ~/bar; done

-x проверяет, существует ли файл и является ли он исполняемым. Смотрите man test для получения дополнительной информации.

Если вы хотите создать рабочие относительные ссылки, вам может понадобиться подумать о том, как вы указали пути к каталогам, или используйте опцию -r для ln (что является несколько новым расширением GNU (≥ 8.16), но должно присутствовать во всех "последних" "раздачи).

Если вы хотите перейти в подкаталоги с помощью этого метода, активируйте globstar с помощью shopt -s globstar и укажите путь поиска как ~/foo/** (см. globstar в руководстве по Bash).

Тест [ -x ] будет включать в себя каталоги с установленным исполняемым битом, которые могут быть не нужны. Если это проблема, можно добавить дополнительный тест [ -f ] проверки соответствия файла.

1

Если вы используете zsh (и я рекомендую попробовать это для магии, подобной этой), вы можете просто использовать спецификатор glob.

ln -s /path/to/foo/*(*) /path/to/bar

(*) означает просто исполняемые файлы; Вы можете использовать аналогичные конструкции для файлов, каталогов, ссылок и т. д. или даже для более сложных операций сортировки и манипуляции.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .