通过通配符的多个符号链接:“ln -s ../*/*.txt TXT/”

通过通配符的多个符号链接:“ln -s ../*/*.txt TXT/”

我正在尝试使用通配符创建多个符号链接,示例如下:

$ 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如果您位于包含,的目录中bTXT则 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,所以两个建议中的通配符将匹配所有三个目录。

相关内容