我想创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
感谢你的宝贵时间。