如何为当前目录中具有相同名称但下划线替换为破折号的每个目录创建符号链接?

时间:2010-05-13 19:57:39

标签: bash symlink

例如,我想我有一个包含以下文件夹的目录

foo_bar
baz

我想要的是一个bash命令,它会将符号链接foo-bar设置为foo_bar,所以它看起来像这样:

foo-bar
foo_bar
baz

我很确定我可以编写一个Python脚本来执行此操作,但我很好奇是否有办法使用bash执行此操作。这就是我被困住的地方:

ls -1 | grep _ | xargs -I {} ln -s {} `{} | sed 's/_/-/'`

我要做的是运行命令ln -s,第一个参数是目录名,第二个参数是通过sed s/_/-/传递的名称。还有另一种方法吗?

2 个答案:

答案 0 :(得分:5)

Bash可以用字符串代替!

for path in *_*; do [ -d "$path" ] && ln -s "$path" "${path//_/-}"; done

如果你想更加选择性地应用它,你可以做类似的事情:

find . -type d [other tests...] | while read path; do [ -d "$path" ] && ln -s "$path" "${path//_/-}"; done

或者您的ls ... | grep ...代替find,当然。

字符串操作的有用参考,包括替换:Manipulating Strings

答案 1 :(得分:2)

我不推荐parsing ls,但是你可以使用它sed和'xargs`来做你想做的事情(如果文件名中有空格,它将不起作用) :

ls *_* | sed 'h;s/_/-/g;x;G;s/\n/ /' | xargs ln -s

但是,我会按照 Jefromi 的方式进行。