%20%D0%B2%20%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3%D0%B5%3F.png)
Я хотел бы создать символические ссылки ( 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
или около того, поскольку это, похоже, обычная задача — по крайней мере, для меня.
решение1
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)
- В 1-й форме создайте ссылку на ЦЕЛЬ с именем LINK_NAME.
- Во 2-й форме создайте ссылку на TARGET в текущем каталоге.
- В 3-й и 4-й формах создайте ссылки на каждую ЦЕЛЬ в КАТАЛОГЕ.
решение2
Вы можете попробовать рекурсивно, используя globstar (bash/zsh set by: shopt -s globstar
):
ls -vs ../**/*.bar .
Примечание: добавлено -v
для большей подробности.
Или, если список слишком длинный, используйте find
утилиту:
find .. -name \*.bar -exec ln -vs "{}" dest/ ';'
Это создаст ссылки в dest/
или изменит их на .
для текущей папки.
решение3
Использоватьfind
certainDir="/path/to/dir"
find -name "*.bar" -exec ln -s {} "$certainDir" \;
Также не забудьте использоватьполные пути(где возможно) с символическими ссылками.
решение4
cp
с -s
опцией можно создавать мягкие ссылки (или -l
для жестких ссылок).
Из текущего каталога можно использовать так:
$ cp -s ../path/with/scripts/* .
В вашем случае это будет так:
$ cp -s ../source/*.bar .