我正在尝试使用通配符创建多个符号链接,示例如下:
$ ls -R
.:
TXT a b
./TXT:
./a:
a.txt
./b:
b.txt
有一个“父目录”,其中包含各种子目录:a、b、TXT。在“a”和“b”中有各种文本文件(上例中的a.txt、b.txt)。
我想为“TXT”子目录中的每个“.txt”文件创建“相对”符号链接。但:
- 不使用“查找”
- TXT 目录中没有“cd”
换句话说,我想知道为什么像下面这样的命令不起作用:
ln -s ../*/*txt TXT/
使用之前的“cd TXT”,它可以工作:
cd TXT
ln -s ../*/*txt .
我认为问题的出现是由于 bash 扩展了“*”和“../”,bash 无法扩展“../*/*.txt”,因为这些文件实际上不存在,所以“ln”不能创建所需的链接:它创建指向相对于当前工作目录的“上一级”目录的 txt 文件的链接。它“cd”到“..”并考虑此级别的所有目录,在其中查找“.txt”文件。
也许“规则”可能是符号链接 TARGET 必须:
- 同时指向真实存在的文件(否则 bash 无法以正确的方式扩展“..”或“*”)
- 它必须相对于包含链接的目录
您能否确认并解释一下到底是什么问题以及可能的解决方案?
附言。使用“find”,类似以下的命令似乎可以工作:
find ./ -path ./TXT -prune -o -iname "*.txt" -type f -exec ln -s ."{}" -t TXT/ \;
请注意,即使在这种情况下,我也必须使用“不存在”路径:
."{}"
但 -exec 命令只是扩展“{}”,即“./a/a.txt”和“./b/b.txt”,因此“ln”可以通过前缀构建相对于 TXT destdir 的正确路径点“.”。
答案1
你正在使用这个命令
ln -s ../*/*txt TXT/
a
如果您位于包含,的目录中b
,TXT
则 shell 将无法扩展../*/*txt
以匹配a
或中的任何内容b
。您必须使用*/*txt
它,但是内部的符号链接TXT
将关闭一个级别,并且它们../
的相对路径中将需要另一个级别。
最简单的解决方案是这样的,但你说你想避免cd
( cd TXT && ln -s ../*/*txt . )
另一种解决方案需要依次修复链接
for f in */*txt
do
ln -s ../"$f" TXT
done
请注意,因为您有源目录a
并且b
与 位于同一级别TXT
,所以两个建议中的通配符将匹配所有三个目录。