2

我想为“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 的文件夹中为每个文件创建一个新的符号链接。

我知道可以使用 find / exec 组合提供“ln -s”文件列表,即

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

.... 但那将是 myfiles 中未过滤的文件列表。我想使用过滤列表。

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

4

4 回答 4

4

尝试使用 xargs:

cat results2.txt | xargs -I{} ln -s {} ~/newlinks
于 2015-06-07T17:39:27.967 回答
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因为它不接受命令模板,但会(默认)发送它认为适合命令行的尽可能多的输入。

于 2015-06-07T17:44:40.437 回答
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
于 2015-06-07T17:55:00.423 回答
0

谢谢,Thomas 和 pasaba ......我找到了一种方法

所以我从 ~/newlinks 做了以下事情:

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

感谢你的宝贵时间。

于 2015-06-07T17:58:35.650 回答