我想在' myfiles'中为所有文件创建符号链接。尚未链接到的,并为刚刚创建的符号链接指定目标文件夹。
我正在成功使用以下cmd来生成现有链接列表,这些链接指向“myfolder”' :
find ~/my-existing-links/ -lname '*/myfiles/*' -printf "%f\n" > results.txt
我使用以下cmd进行反向匹配,即列出myfiles中未链接到的文件:
ls ~/myfiles | grep -vf results.txt > results2.txt
因此,results2.txt有一个文件列表,我现在想要在一个名为〜/ newlinks的文件夹中创建一个新的符号链接....
我知道有可能提供' ln -s'使用find / exec组合的文件列表,即
find ~/myfiles/ -exec ln -s {} -t ~/newlinks \; -print
....但那将是myfiles中未经过滤的文件列表。我想使用过滤后的列表。
我有什么想法可以做到这一点?我将定期向myfiles添加文件,因此会定期访问该文件夹,以便为所有新文件生成符号链接,这样我就可以逻辑地划分链接(而不是更改原始文件名)。
答案 0 :(得分:3)
尝试使用xargs:
cat results2.txt | xargs -I{} ln -s {} ~/newlinks
答案 1 :(得分:2)
您可以使用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
一起使用,因为它不接受命令模板,但会(默认)发送它认为适合命令行的输入。
答案 2 :(得分:1)
因此,您有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
答案 3 :(得分:0)
谢谢,Thomas和pasaba ...... I found a way to do it:
所以我从〜/ newlinks做了以下事情:
while read line; do ln -s "$line" "${line##*/}" ; done < ~/myfiles/results2.txt
再次感谢您的时间。