Как сделать символическую ссылку на каждый каталог в текущем каталоге, который имеет то же имя, но подчеркивания заменены на тире? - PullRequest
1 голос
/ 13 мая 2010

Например, я полагаю, у меня есть каталог, содержащий следующие папки

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 ]

5 голосов
/ 14 мая 2010

Баш может подставить в строки!

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.

Полезный справочник по манипулированию строками, включая подстановку: Управление строками .

2 голосов
/ 14 мая 2010

Я не рекомендую парсинг ls, но вот как вы можете использовать его с sed и 'xargs`, чтобы делать то, что вы хотите (это не будет работать, если в имена файлов):

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

Однако я бы поступил так, как показал Джефроми .

...