0

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

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

2 回答 2

0

这里有三个问题。

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

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

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

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

PS:还有basenamewhich 可以用来代替,${a##*/}但还是不能-execfind.

于 2012-09-21T15:20:38.490 回答
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 !

于 2012-09-21T20:06:53.890 回答