例如,我想我有一个包含以下文件夹的目录
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/_/-/
传递的名称。还有另一种方法吗?
答案 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 的方式进行。