2012-11-27 80 views
2

我试图从查找命令的结果中创建一个符号链接(软链接)。我使用sed删除文件名前面的./。我这样做是为了让我可以将文件名粘贴到链接保存路径的末尾。我正在使用Ubuntu Server 8.04进行这项工作。从查找中创建符号链接

我这个职位,这是一种解决我的问题的教训,但不quite-

How do I selectively create symbolic links to specific files in another directory in LINUX?

产生的文件名没有工作,虽然如此,我开始努力学习AWK然后决定sed。

我正在使用单线循环来完成此操作。问题在于循环的结构是分隔文件名,为文件名中的每个单词创建一个链接。有相当多的文件,我想自动化每个链接采取它链接文件的文件名的过程。

我很喜欢基本的bash命令,但我远不是命令行专家。我用ls和awk开始了这个工作,然后开始寻找sed。我的sed语法可能会更好,但我已经在两天内学会了这一点,现在我有点卡住了。

为吨find -type f -name "*txt*" | sed -e 's/.//' -e 's$/$$'; do echo ln -s $t ../folder2/$t;

任何帮助或建议将不胜感激。谢谢。

+0

可以避开'/'从'输出传递一个列表find'。的路径。 'find */-options ...'我想这也可能有一个选项。 – tripleee

+0

非工作链接的问题是相对路径名称需要相对于链接目标。重写以启动循环一个目录('find source -options ... -exec ln -s'{}'target \;'),使用绝对路径或扩展您的'sed'脚本来解析相对于目的地(在前面添加“../ source /”)。 “ln -s”的第一个参数没有以任何方式被重写,它被逐字地用作符号链接的内容,没有要求或检查它在链接创建时解析为现有文件。 – tripleee

+0

我想你是指'sed'%^ \ ./%%''。为了允许在正则表达式中使用斜杠,'sed'允许你在's'命令之后使用任何标点符号,尽管斜线是传统的默认分隔符,在'vi'和'ed'之前模仿了搜索字符它。或者,您可以反斜杠 - 将分隔符转义为在表达式中将其引用为文字字符。 – tripleee

回答

2

执行你的循环是这样的:

(IFS=$'\n'; for t in `find -type f -name "*txt*" | sed 's|.*/||'`; do ln -s $t ../folder2/$t; done) 

通过IFS设置为仅换行,你应该能够读取整个文件名没有在空间越来越分裂。

括号用于确保循环在子shell中执行,并且当前shell的IFS不会被更改。

+0

谢谢!这就是我一直在寻找的。我不确定我是否正确使用find和sed命令,并且帮助我了解需要进行必要更改的位置。在我的阅读中,我看到我可以在sed中使用其他字符(即%)。我看到的例子使用$,所以我尝试了它,它的工作。我会尝试使用你的提示来修改我的sed语法,并希望得到这个工作。再次感谢。 – mark

6

更简单:

转到文件夹,你想拥有的文件,并做到:

find /path/with/files -type f -name "*txt*" -exec ln -s {} . ';'