使用Bash,如何在不使用'find'的情况下将文件列表提供给'ln -s'?

我想创build符号链接到'myfiles'中的所有文件,这些文件还没有被链接到,并为刚创build的符号链接指定目标文件夹。

我正在使用以下cmd,成功地生成现有链接的列表,指向“我的文件夹”:

find ~/my-existing-links/ -lname '*/myfiles/*' -printf "%f\n" > results.txt 

而我正在使用下面的cmd来反向匹配,即列出myfiles中没有链接到的文件:

 ls ~/myfiles | grep -vf results.txt > results2.txt 

所以,results2.txt有一个文件列表,我现在要创build一个新的符号链接到一个名为〜/ newlinks的文件夹中。

我知道有可能使用find / exec组合来提供'ln -s'文件列表

 find ~/myfiles/ -exec ln -s {} -t ~/newlinks \; -print 

….但是这将是myfiles中的未经过滤的文件列表。 我想要使​​用过滤的列表。

任何想法,我可以做到这一点? 我将定期添加文件到myfiles,所以会定期访问该文件夹,以便为所有新文件生成符号链接,以便能够逻辑地将链接分开(而不是更改原始文件名)。

尝试使用xargs:

 cat results2.txt | xargs -I{} ln -s {} ~/newlinks 

您可以使用xargs来应用链接,以便您的复合命令可能如下所示:

 find ~/myfiles/ | grep -vf results.txt | xargs make-my-links 

make-my-links会是一个像这样的脚本:

 #!/bin/sh for source in "$@" do ln -s "$source" -t ~/newlinks done 

单独的脚本和循环与xargs一起使用,因为它不接受命令模板,但会(默认)发送尽可能多的输入,它们认为可以放在命令行上。

所以,你有3个实体类型的目录

  • ~/myfiles/ :包含你的文件。
  • ~/my-existing-links/ :包含来自~/myfiles/文件的链接。
  • ~/newlinks/ :包含从~/myfiles/

对我来说,第三个实体是没有必要的。 为什么新链接不是直接在~/my-existing-links/

我只使用一个脚本来更新~/my-existing-links/中的链接列表,无论何时在~/myfiles/中添加新文件:

update_v1.sh

 #!/bin/bash for f in $(find ~/myfiles -type f); do ln -sf "$f" "~/my-existing-links/$(basename $f)" done 

update_v2.sh

 find ~/myfiles -type f -exec sh -c \ 'for f; do ln -sf "$f" "~/my-existing-links/${f#*/}"; done' sh {} + 

update_print.sh

 #!/bin/bash for f in $(find ~/myfiles -type f); do if [[ ! -L "~/my-existing-links/${f#*/}" ]]; then echo "Link not existing for $f" fi done 

谢谢,Thomas和pasaba … 我找到了一个办法 :

所以我从〜/ newlinks做了以下工作:

 while read line; do ln -s "$line" "${line##*/}" ; done < ~/myfiles/results2.txt 

感谢你的宝贵时间。