【问题标题】:Linux Symbolic Link Append NameLinux 符号链接附加名称
【发布时间】:2024-01-11 17:23:01
【问题描述】:

有人可以帮助创建一个符号链接,我将自己的字符串附加到链接的名称中吗?这是我到目前为止的代码:

find /home/folder1/*.txt -type f -exec ln -s {} \;
find /home/folder2/*.txt -type f -exec ln -s {} \;

所以该命令可以创建我的符号链接,但我想将我自己的文本附加到链接名称,因为我可以在每个文件夹和目标中拥有相同的文件名,我需要找到一种方法来提供唯一名称到符号链接。所以我正在考虑创建符号链接,如下所示:

folder1_doc1.txt
folder2_doc1.txt
folder1_doc2.txt
folder2_doc2.txt

我认为脚本应该是这样的:

find /home/folder1/*.txt -type f -exec ln -s {} "folder1_" +\;
find /home/folder1/*.txt -type f -exec ln -s {} "folder2_" + \;

【问题讨论】:

    标签: linux find wildcard symlink


    【解决方案1】:

    这里有三个问题。

    1. 匹配文件的名称在{}

    2. {} 中的名称是文件的完整路径(在您的情况下为 /home/folder1/a.txt)。您需要删除所有内容,直到最后一个 / 拥有文件名。一种解决方案是使用string manipulation 并从那里开始工作,为什么我们需要使用## 进行最大删除,使用*/ 进行匹配:

      $ a="home/files/folder1/s"; echo $a ${a##*/}
      home/files/folder1/s s
      
    3. 您不能在 ${...} 构造中使用 {}。因此,我将使用for 替换您的find ... -exec ... 命令并执行相同的操作:

      for file in `/home/folder1/*.txt`; do ln -s $file folder1_${file##*/}; done
      

    PS:还有basename可以用来代替${a##*/},但它仍然不能在find-exec部分中使用。

    【讨论】:

      【解决方案2】:

      您可以使用 awk 之类的流编辑器来快速执行此类操作。试试例如:

      find /home/folder1/*.txt -type f | awk -F '.txt' '{printf "ln -s %s %s_CUSTOM_TEXT.txt\n", $0, $1}'
      

      这将打印出一堆可能与您想在终端中键入的内容相近的命令。玩弄 awk strink 让它准确说出您想要的内容,然后将结果通过管道传输到 sh:

      find /home/folder1/*.txt -type f | awk -F '.txt' '{printf "ln -s %s %s_CUSTOM_TEXT.txt\n", $0, $1}' | sh
      

      做这种事要小心;确保你不要将一堆你实际上不想被执行的命令传递给 sh!

      【讨论】:

      • 在给出完整的解决方案之前,您需要准确地确定您想要自定义文本的内容。您建议的问题是,如果子文件夹例如folder1 具有相同名称的文件,那么它们都将获得相同的符号链接名称。例如: /home/folder1/subfolder1/t.txt 和 /home/folder1/subfolder2/t.txt 都会获得名为 folder1_t.txt 的链接。一个简单的解决方案是例如编号所有文本文件,从第一个到最后一个查找结果。