使用Bash,如何将文件列表输入到&nbsp -s'没有使用'找到'?

时间:2015-06-07 17:18:15

标签: linux bash find ln

我想在' 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添加文件,因此会定期访问该文件夹,以便为所有新文件生成符号链接,这样我就可以逻辑地划分链接(而不是更改原始文件名)。

4 个答案:

答案 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

再次感谢您的时间。