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

おすすめ記事