Як створити символьні посилання на всі файли (клас файлів) у каталозі?


43

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

foo.bar
baz.bar

як я можу передати список параметрів до ln -sтого, на який він врешті вирішується

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

Звичайно, я знаю, що можу написати скрипт-баш, але там має бути щось простіше, 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

: плескати: приємно!
Кріс Шмітц

3

Використовуйте find

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

Крім того, не забудьте використовувати повні шляхи (де це можливо) із символьними посиланнями.


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

Це залежить від того, де ви хочете пов'язувати каталоги. І я не можу пригадати, чому повні шляхи - це гарна ідея, можливо, це було для жорстких посилань, але я спала це на розум чомусь. Хммм.
щойноросло

Спасибі, ваша відповідь чудова. Оскільки відповідь mpy - це найпростіший варіант вирішення питання, питання йдеться про нього. Я б прийняв обидві відповіді, якби міг.
dastrobu

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.