簡體   English   中英

使用Bash,如何在不使用'find'的情況下將文件列表饋入'ln -s'?

[英]Using Bash, how do I feed a file list into a 'ln -s' without using 'find'?

我想創建指向“ myfiles”中尚未鏈接的所有文件的符號鏈接,並為剛剛創建的符號鏈接指定目標文件夾。

我正在成功使用以下cmd生成指向“ myfolder”的現有鏈接的列表:

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

我正在使用以下cmd進行反向匹配,即列出未鏈接到的myfile中的文件:

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添加文件,因此將定期訪問該文件夾,以便為所有新文件生成符號鏈接,這樣我就可以邏輯上分割鏈接(而不是更改原始文件名)。

嘗試使用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個類型為directory的實體:

  • ~/myfiles/ :包含您的文件。
  • ~/my-existing-links/ :包含~/myfiles/文件的鏈接。
  • ~/newlinks/ :包含~/myfiles/新文件的鏈接

對我來說,第三實體是不必要的。 為什么不直接在~/my-existing-links/創建新鏈接?

每當在~/myfiles/中添加新文件時,我只會使用腳本來更新~/my-existing-links/中的鏈接列表:

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

謝謝,托馬斯和帕薩巴... 我找到了一種方法

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

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

感謝你的寶貴時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM