在 for 循环中创建符号链接

在 for 循环中创建符号链接

使用单个参数,ln -s将在当前目录中创建一个符号链接:

$ ls /opt/my_tests
hello_world.c hello_world
$ 
$ echo $PWD
/home/chris/my_links
$ ln -s /opt/my_tests/hello_world.c
$ ls -l
lrwxrwxrwx 1 chris chris 28 May  3 13:08 hello_world.c -> /opt/my_tests/hello_world.c

但是,如果我尝试在 for 循环中执行此操作,它会认为该文件存在:

$ for f in "/opt/my_tests/*"
> do
> ln -s $f
> done
ln: failed to create symbolic link '/opt/my_tests/hello_world.c': File exists

我误解/做错了什么?

答案1

您的问题是您引用了 glob,这导致它在 for 循环求值时不会被扩展。稍后您将得到一个裸露的、未加引号的$f,它扩展了先前引用的 glob 并导致所有与该 glob 匹配的文件立即传递到ln.

比较:

$ touch foo bar baz
$ for file in "*"; do echo ln -s $file; done
ln -s bar baz foo
$ for file in *; do echo ln -s "$file"; done
ln -s bar
ln -s baz
ln -s foo

因此,您真正想要的是在 for 循环求值时扩展 glob,然后引用结果项(带或不带引号 for /opt/my_tests/):

for file in /opt/my_tests/*; do
    ln -s "$file"
done

相关内容