29

Я хотел бы создать символические ссылки (ln -s) на все файлы (или класс файлов, например, заканчивающийся на .bar) в определенной директории. Скажи, что я в cwd и типа ls ../source/*.bar дает мне

foo.bar
baz.bar

как я могу передать список параметров в ln -s который он, наконец, разрешает

ln -s ../source/foo.bar
ln -s ../source/baz.bar

Конечно, я знаю, что могу написать скрипт bash, но должно быть что-то более простое с участием xargs или около того, так как это кажется обычной задачей - по крайней мере для меня.

3 ответа3

58

ln принимает несколько аргументов, но в этом случае не забудьте указать целевой каталог.

Итак, в вашем примере . является целевым каталогом, поэтому он должен быть

ln -s ../source/*.bar .

От man ln ; команда выше использует 3-ю форму:

ln [OPTION]... [-T] TARGET LINK_NAME   (1st form)
ln [OPTION]... TARGET                  (2nd form)
ln [OPTION]... TARGET... DIRECTORY     (3rd form)
ln [OPTION]... -t DIRECTORY TARGET...  (4th form)
  • В первой форме создайте ссылку на TARGET с именем LINK_NAME.
  • Во 2-й форме создайте ссылку на TARGET в текущем каталоге.
  • В 3-й и 4-й формах создайте ссылки на каждый ЦЕЛЬ в СПРАВОЧНИКЕ.
3

Используйте find

certainDir="/path/to/dir"
find -name "*.bar" -exec ln -s {} "$certainDir" \;

Также не забывайте использовать полные пути (где это возможно) с символическими ссылками.

3

Вы можете попробовать рекурсивно либо с использованием globstar (bash/zsh устанавливается с помощью: shopt -s globstar):

ls -vs ../**/*.bar .

Примечание: добавлен -v для подробного описания.

Или, если список слишком длинный, используйте утилиту find :

find .. -name \*.bar -exec ln -vs "{}" dest/ ';'

Это создаст ссылки в dest/ или изменит его на . для текущей папки.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .