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

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

Я хотел бы создать символические ссылки ( 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 .

Связанный контент