我在使用 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: =}'