如何创建指向目录中所有文件(文件类)的符号链接?


43

我想创建ln -s指向.bar某个目录中所有文件(或文件类,例如以结尾)的符号链接()。说我在cwd中,类型ls ../source/*.bar给我

foo.bar
baz.bar

我如何将参数列表传递给ln -s它最终解析为

ln -s ../source/foo.bar
ln -s ../source/baz.bar

当然,我知道我可以编写bash脚本,但是应该涉及一些简单的事情xargs,因为这似乎是一项常见的任务-至少对我而言。

Answers:


75

ln 确实有多个参数,但是在这种情况下请不要忘记提供目标目录。

因此,在您的示例中.是目标目录,因此它应该像

ln -s ../source/*.bar .

来自man ln; 上面的命令使用第三种形式:

ln [OPTION]... [-T] TARGET LINK_NAME   (1st form)
ln [OPTION]... TARGET                  (2nd form)
ln [OPTION]... TARGET... DIRECTORY     (3rd form)
ln [OPTION]... -t DIRECTORY TARGET...  (4th form)
  • 在第一种形式中,创建一个名为LINK_NAME的TARGET链接。
  • 在第二形式中,在当前目录中创建指向TARGET的链接。
  • 在第3和第4个表单中,创建指向DIRECTORY中每个TARGET的链接。

5
您刚刚为我节省了5分钟的生命,这笔钱足以花其中一个时间发表评论。:-)
moodboom 2015年

如果没有文件,这将不起作用*.bar。它将创建一个名称为的链接"*.bar",这不是您想要的。
Nimrod

1
@Nimrod:是的,但是您可以告诉bash您希望它报告错误,而不是通过shopt -s failglob; 参见例如unix.stackexchange.com/a/216227/33390(在等效的zshsetopt nomatch,它是由默认接通)
MPY

:拍手:不错!
克里斯·施密茨

3

使用 find

certainDir="/path/to/dir"
find -name "*.bar" -exec ln -s {} "$certainDir" \;

另外,请记住在符号链接中使用完整路径(如果可能)。


2
谢谢,不是find $certainDir -name "*.bar" -exec ln -s {} \;吗?为什么要使用完整路径?当我在wihch上移动目录树时,知道链接保持完整很方便,它具有一些内部链接。
dastrobu

这取决于您要在哪里符号链接目录。而且我不记得为什么全路径是一个好主意,可能是硬链接,但是我出于某种原因将其烧入了脑海。嗯
justbrowsing

谢谢,您的回答很好。由于mpy的答案是对该问题的更简单的解决方案,因此重点就在他/她身上。如果可以的话,我会接受两个答案。
dastrobu

3

您可以使用globstar(bash / zsh设置为:)进行递归尝试shopt -s globstar

ls -vs ../**/*.bar .

注意:添加-v用于详细说明。

或者,如果列表太长,请使用find实用程序:

find .. -name \*.bar -exec ln -vs "{}" dest/ ';'

这将在中创建链接dest/,或将其更改.为当前文件夹。


第二个是正确答案。
宁录

0

cpwith -s选项可以创建软链接(或-l用于硬链接)。

从当前目录可以这样使用:

$ cp -s ../path/with/scripts/* .

您的情况将是这样的:

$ cp -s ../source/*.bar .
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.