LINUX: Свяжите все файлы из одного каталога в другой [закрыто]

123

Я хочу ссылку ( ln -s) все файлы , которые находятся в /mnt/usr/lib/в/usr/lib/

Файлов много, как это сделать быстро? :)

SharpC
источник
Сколько файлов - это «много» и насколько быстро вы считаете «быстрым»?
Эрик Смит
4
Это 50:50 вне зависимости от того, подходит ли он для «serverfault» или «superuser», но это не программирование, то есть не для stackoverflow.
Марк Гравелл

Ответы:

202
ln -s /mnt/usr/lib/* /usr/lib/

Я думаю, это принадлежит суперпользователю.

Тим Купер
источник
6
Это не включает скрытые файлы, а связывает целые каталоги. Если что-то из этого не то, что вам нужно, см. Мой ответ. В противном случае это кратчайший путь.
Cascabel
Ты прав. Но библиотеки обычно не прячутся. В любом случае используются точечные файлы, ваше решение будет более удобным.
1
будет ли он постоянно указывать на другую папку?
nmkyuppie
@YuPPie Я думаю, он просто создает жесткую ссылку на каждый файл в каталоге. (это то, что я хотел сегодня, поэтому +1: D)
Отображаемое имя
2
@SargeBorsch Создает символические ссылки (жесткие ссылки бывают разные).
jsejcksn
90

GNU cpимеет возможность создавать символические ссылки вместо копирования.

cp -rs /mnt/usr/lib /usr/

Обратите внимание, что это расширение GNU, которого нет в POSIXcp .

кафе
источник
4
Ваш текущий каталог должен быть / usr /, чтобы создать символическую ссылку таким образом
Soul_man
@caf Если местом назначения является существующая папка, тогда папка lib создается в папке / usr /
Тамил Селван C
2
Хороший ответ. Также может использоваться для создания жестких ссылок с -l вместо -s.
Факс
19
ln -s /mnt/usr/lib/* /usr/lib/
Михаил Крелин - хакер
источник
15

Опубликованные решения не будут связывать какие-либо скрытые файлы. Чтобы включить их, попробуйте следующее:

cd /usr/lib
find /mnt/usr/lib -maxdepth 1 -print "%P\n" | while read file; do ln -s "/mnt/usr/lib/$file" "$file"; done

Если вам нужно рекурсивно создавать каталоги и только связывать файлы (так что если вы создаете файл в каталоге, его на самом деле /usr/libнет /mnt/usr/lib), вы можете сделать это:

cd /usr/lib
find /mnt/usr/lib -mindepth 1 -depth -type d -printf "%P\n" | while read dir; do mkdir -p "$dir"; done
find /mnt/usr/lib -type f -printf "%P\n" | while read file; do ln -s "/mnt/usr/lib/$file" "$file"; done
Cascabel
источник
2
Я считаю, что это также должно работать как способ подстановки в скрытых файлах, если в bash включена расширенная глобализация. Он соответствует всему, что начинается с точки, за которой следует что-то, кроме ничего или другая точка (т.е. исключает ./и ../):ln -s /mnt/usr/lib/.!(|.)* /usr/lib
Cascabel