Как создать символические ссылки на все файлы (класс файлов) в каталоге?


43

Я хотел бы создать символические ссылки ( 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так как это кажется обычной задачей - по крайней мере, для меня.

Ответы:


75

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-й формах создайте ссылки на каждый ЦЕЛЬ в КАТАЛОГЕ.

5
Вы только что спасли мне 5 минут моей жизни, которых стоило потратить один из них, оставив комментарий. :-)
moodboom

Это не работает, если нет файлов *.bar. Это создаст ссылку с именем "*.bar", которое не то, что вы хотите.
Нимрод

1
@Nimrod: Это правда, но вы можете сказать bash, что хотите, чтобы он сообщал об ошибке, а не через shopt -s failglob; см., например, unix.stackexchange.com/a/216227/33390 (эквивалент в zsh есть setopt nomatch, который включен по умолчанию)
mpy

: clapping: приятно!
Крис Шмитц

3

использование find

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

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


2
Спасибо, но не так ли find $certainDir -name "*.bar" -exec ln -s {} \;? И почему я должен использовать полные пути? Мне очень удобно знать, что ссылки остаются неизменными, когда я перемещаю дерево каталогов, у которого есть некоторые внутренние ссылки.
Дастробу

Это зависит от того, где вы хотите создать символическую ссылку на каталоги. И я не могу вспомнить, почему полные пути являются хорошей идеей, возможно, это были жесткие ссылки, но я по какой-то причине сжег это в своей голове. Хммм.
только что

Спасибо, ваш ответ великолепен. Поскольку ответ mpy - более простое решение вопроса, вопрос переходит к нему / ней. Я бы принял оба ответа, если бы мог.
Дастробу

3

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

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

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

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

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

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


Второй - правильный ответ.
Нимрод

0

cpс -sопцией можно создавать мягкие ссылки (или -lдля жестких ссылок).

Из текущего каталога можно использовать вот так:

$ cp -s ../path/with/scripts/* .

В вашем случае это будет так:

$ cp -s ../source/*.bar .
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.