У меня есть каталог с файлами кода и исполняемыми файлами, и я хочу знать, как создать символическую ссылку только на исполняемые файлы в этом каталоге?
Я знаю, что path-of-directory/*
выбирает все файлы, но мне нужны только исполняемые файлы.
У меня есть каталог с файлами кода и исполняемыми файлами, и я хочу знать, как создать символическую ссылку только на исполняемые файлы в этом каталоге?
Я знаю, что path-of-directory/*
выбирает все файлы, но мне нужны только исполняемые файлы.
Вы можете использовать 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 \;
Обратите внимание, что это не поиск двоичных файлов, а просто тех, у которых установлен исполняемый бит.
Другая возможность:
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 ]
проверки соответствия файла.
Если вы используете zsh (и я рекомендую попробовать это для магии, подобной этой), вы можете просто использовать спецификатор glob.
ln -s /path/to/foo/*(*) /path/to/bar
(*)
означает просто исполняемые файлы; Вы можете использовать аналогичные конструкции для файлов, каталогов, ссылок и т. д. или даже для более сложных операций сортировки и манипуляции.