Linux符号链接附加名称

时间:2012-09-21 14:58:14

标签: linux find wildcard symlink

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

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

所以这个命令可以创建我的符号链接,但我想将自己的文本附加到链接名称,因为我可以在每个文件夹和目的地中使用相同的文件名,我需要找到一种方法来给出唯一的名称到符号链接。所以我想创建sym链接看起来像这样:

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_" + \;

2 个答案:

答案 0 :(得分:0)

这里有三个问题。

  1. 匹配文件的名称位于{}

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

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

    for file in `/home/folder1/*.txt`; do ln -s $file folder1_${file##*/}; done
    
  4. PS:还有basename可以代替${a##*/}使用,但它仍然无法在-exec的{​​{1}}部分使用。

答案 1 :(得分:0)

您可以使用像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,你真的不想被执行!