有人可以帮助创建一个符号链接,我将自己的字符串附加到链接的名称?这是我到目前为止的代码:
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_" + \;
答案 0 :(得分:0)
这里有三个问题。
匹配文件的名称位于{}
。
{}
中的名称是文件的完整路径(在您的情况下为/home/folder1/a.txt
)。您需要删除所有内容,直到最后/
拥有文件名。一种解决方案是使用string manipulation并从那里开始工作,为什么我们需要使用##
进行最大的删除,并使用*/
来匹配glob:
$ a="home/files/folder1/s"; echo $a ${a##*/}
home/files/folder1/s s
您无法在{}
构造中使用${...}
。因此,我会使用find ... -exec ...
替换您的for
命令并执行相同的操作:
for file in `/home/folder1/*.txt`; do ln -s $file folder1_${file##*/}; done
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,你真的不想被执行!