使用(即)find | sed | xargs 进行符号链接而不使用 xargs:参数行太长

使用(即)find | sed | xargs 进行符号链接而不使用 xargs:参数行太长

我在使用 find、xargs 和 sed 进行符号链接时遇到了困难。

给定文件夹结构:

/abc
 /def
 /*/def

/builds

在我的本地机器上,以下语句有效。

find ./abc \
      -type d \
      -name def \
      -prune \
      -maxdepth 3 \
      -print0 | \
        parallel -0 /bin/bash \
          -c 'echo "/builds/{}" > >(sed -e "s/\.\/abc\///") | \
            parallel -I % ln -s % {}'

... 成功将/def中找到的所有目录符号链接到/abc和。/builds/def/builds/*/def

然而我的管道抛出了xargs: argument line too long

起初我以为我可以做类似的事情:

ln -s <(parameter1) <(parameter2)

...但从外表看,ln它不接受文件输入。

经过一番研究,GNU Parallel它似乎是完成这项工作的更好的工具,但它不允许我执行以下操作。

parallel -0 /bin/bash -c 'echo "/builds/{}" > >(sed -e "s/\/abc\///") | parallel -I % ln -s % {}'

这里最简单、最合理的解决方案是什么?

答案1

最终这样做了:

find ./abc \
  -type d \
  -name def \
  -prune \
  -maxdepth 3 | parallel -q /bin/bash -c 'var=$(echo "/builds/{}" > >(sed -e "s/\.\/abc\///"));ln -s {} $var'

答案2

简短:

find ./abc \
  -type d \
  -name def \
  -prune \
  -maxdepth 3 | parallel ln -s {} '{= s:^./abc:/builds: =}'

相关内容