Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 递归地将文件从一个文件夹链接到另一个文件夹_Bash_Shell_Unix - Fatal编程技术网

Bash 递归地将文件从一个文件夹链接到另一个文件夹

Bash 递归地将文件从一个文件夹链接到另一个文件夹,bash,shell,unix,Bash,Shell,Unix,我的结构如下: /foo /foo/pages /foo/pages/page1 file100.txt file101.txt /foo/pages/page1/item1 file199.txt /foo/pages/page2 filefoo202.txt bar3.txt /foo/pages/page3 /foo/bar 我想获取/foo/pag

我的结构如下:

/foo
/foo/pages
/foo/pages/page1
              file100.txt
              file101.txt
/foo/pages/page1/item1
              file199.txt
/foo/pages/page2
              filefoo202.txt
              bar3.txt
/foo/pages/page3
/foo/bar
我想获取
/foo/pages
中以
.txt
结尾的每个文件,并在
/foo/bar
中创建一个符号链接。该命令将从
/foo
执行

/foo/bar
的最终结果是:

/foo/bar
    file100.txt
    file101.txt
    file199.txt
    filefoo202.txt
    bar3.txt
注意:我使用的是Linux/Bash

cd bar  # maybe 'mkdir bar' before
for i in ../pages/*.txt
do
  ln -s "$i"
done
相对符号链接是创建文件的起点

否则绝对符号链接:

find foo -type f -exec ln -s "$PWD"/{} foo/bar/ \;

修正了斜杠。我正在努力用find、extract the name等来实现它,但我想知道这是否是一种简单的实现方法。它不提供递归,也不在/foo/barI中创建链接。我不明白为什么不应该这样做。指定从
/foo/
开始。开始时,我将
cd
插入
bar
。然后我创建指向每个
。/pages/*.txt
的符号链接。它们是在我所在的位置用目标的basename创建的。不过,我看不出您期望的是什么“递归”。啊,我现在看到您还有深度嵌套的结构。我的解决方案只解决第一层的问题。你自己的答案能正确地将树向下移动。你不需要那种
sed
的东西。一个简单的
ln-s“$i”
就足够了。但是你需要在
$i
周围加引号,以防任何文件中有空格。请注意,如果没有sed内容和双引号,阅读起来就容易多了,以确保空格不是问题。谢天谢地,没有充分理由的引用有几个缺点。首先,可能有一个包含空格的文件。也许只是偶然,也许在以后的情况下。其次,其他审查您代码的开发人员可能会对您为什么省略它们感到困惑,因为省略它们意味着您需要对变量内容进行另一个计算步骤。第三,您可能会养成忽略它们的习惯,而忽略它们在大多数情况下是没有好处的,而且在许多情况下是一个普通的bug。不要忘记,这里给出的答案不应该仅仅解决您的特殊情况。
find foo -type f -exec ln -s ../../{} foo/bar/ \;
find foo -type f -exec ln -s "$PWD"/{} foo/bar/ \;