我有一个包含代码文件和可执行文件的目录,我想知道如何仅创建指向该目录中的可执行文件的符号链接?
我知道path-of-directory/*
选择所有文件但我只想要可执行文件。
答案1
您可以使用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 \;
请注意,这不是搜索二进制文件,而只是搜索那些设置了可执行位的文件。
答案2
另一种可能性:
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 ]
可以添加额外的测试来查看匹配项是否是文件。
答案3
如果你使用 zsh(我建议你尝试一下这样的魔法),你可以简单地使用glob 限定符。
ln -s /path/to/foo/*(*) /path/to/bar
(*)
表示仅可执行文件;您可以对文件、目录、链接等使用类似的构造,甚至进行更高级的排序和操作。