Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: массовое создание символических ссылок  (Прочитано 1066 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн _92

  • Автор темы
  • Любитель
  • *
  • Сообщений: 88
  • puppyrus.org
    • Просмотр профиля
    • 10021987.ru
есть список директорий, внутри есть определенный файл (не обязательно в первом уровне)
нужен bash-скрипт (скорее всего)
1 с рекурсивным поиском и созданием символических ссылок (ln -s) с этих определенных файлов
2 переносом их в другую директорию с сохранением имен исходных директорий

пример

исходное
директория1/файл
директория2/директория2_1/файл
директория3/файл
..

желаемый результат 1
директория0/директория1/символьная_ссылка_на_файл
директория0/директория2/символьная_ссылка_на_файл
директория0/директория3/символьная_ссылка_на_файл
..

или желаемый результат 2 (просто добавляем в начало имени ссылки имя родительской директории)
директория0/директория1_символьная_ссылка_на_файл
директория0/директория2_символьная_ссылка_на_файл
директория0/директория3_символьная_ссылка_на_файл
..

зы
существует схожее решение, но не соображу как адаптировать его под bash
http://barbitoff.blogspot.ru/2012/02/bat.html
« Последнее редактирование: 26 Ноябрь 2016, 19:59:43 от _92 »
g4600 + ssd + ddr4

Axa-Ru

  • Гость
Re: массовое создание символических ссылок
« Ответ #1 : 26 Ноябрь 2016, 19:58:42 »
А что у вас конкретно не получается?

adawdp

  • Гость
Re: массовое создание символических ссылок
« Ответ #2 : 26 Ноябрь 2016, 20:12:02 »
2016 Nov 26; 12:12 PM

— Понимаете ли, _92, Ваше сообщение больше напоминает техническое задание :), уж простите великодушно. Ну а раз похоже на задание, может стоит написать что-то похожее на обещание вознаграждения? :)

— Начинайте писать, а когда перестанет получаться, спрашивайте что не так, я думаю Вам обязательно помогут.

Онлайн Azure

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 5660
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Re: массовое создание символических ссылок
« Ответ #3 : 26 Ноябрь 2016, 20:50:09 »
Код: Bash
  1. find */ -name файл -printf 'ln -s %p <path>/директория0/%H_%f\n' | bash
NB! Учтите что в случае
Код: XML
  1. директория2/директория2_1/файл
  2. директория2/директория2_2/файл
  3. директория2/директория2_3/файл
ссылка будет только 1 на последний.

В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 1967
    • Просмотр профиля
Re: массовое создание символических ссылок
« Ответ #4 : 26 Ноябрь 2016, 22:24:28 »
Может просто:
Код: Bash
  1. cp -rs 'путь до исходной директории' 'куда ее скопировать симлинками'
« Последнее редактирование: 26 Ноябрь 2016, 22:27:07 от renzrv »

Онлайн Azure

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 5660
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Re: массовое создание символических ссылок
« Ответ #5 : 26 Ноябрь 2016, 22:29:09 »
renzrv, так понимаю что есть и другие файлы/директории которые копировать не надо +
директория1/файл
директория2/директория2_1/файл
директория3/файл
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 1967
    • Просмотр профиля
Re: массовое создание символических ссылок
« Ответ #6 : 26 Ноябрь 2016, 22:43:36 »
Так файлы ведь и не копируются. В директории куда скопировать просто создается полная копия
исходной директории, но с одними симлинками вместо файлов.
А какие копировать не надо, я что то не понял.

Пользователь добавил сообщение 26 Ноябрь 2016, 23:00:52:
Если нужно для всех файлов из исходной папки (и подпапок) создать симлинки в одной другой папке,
без создания подпапок исходной папки, тогда вот:
Код: Bash
  1. DEST_DIR="путь к папке куда ложить симлинки" ; \
  2. find "путь до исходной папки" -type f \
  3. | sed -rn 's|^(.*/)([^/]+)$|\2/\1\2|p' \
  4. | sort -t/ -k1 | cut -d/ -f2- | nl \
  5. | sed -rn "s|^\s*([0-9]+)\s*(.+/)([^/]+)$|\2\3\n$DEST_DIR/\1 \3|p" \
  6. | xargs -d '\n' -L2 -n2 ln -s
Для обеспечения уникальности - к именам ссылок добавляется номер.
Перед нумерацией и соданием ссылок все файлы из исходной папки сортируются по имени.
Пути к папкам должны быть только полные (т.е от корня /).
« Последнее редактирование: 27 Ноябрь 2016, 15:50:43 от renzrv »

Оффлайн _92

  • Автор темы
  • Любитель
  • *
  • Сообщений: 88
  • puppyrus.org
    • Просмотр профиля
    • 10021987.ru
Re: массовое создание символических ссылок
« Ответ #7 : 28 Ноябрь 2016, 11:58:30 »
Ваше сообщение больше напоминает техническое задание
не, у меня просто много проектов на домашнем ноуте в st3, плагин project manager позволяет хранить настройки проекта в отдельной директории, а вот плагин sftp хранит настройки только внутри самой директории проекта (*)

Так файлы ведь и не копируются. В директории куда скопировать просто создается полная копия
исходной директории, но с одними симлинками вместо файлов.
дело в том, шо в моем случае символьная ссылка создается в директории облака
т.о. нужно выгружать не все файлы проекта, а только (*)
g4600 + ssd + ddr4

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 1967
    • Просмотр профиля
Re: массовое создание символических ссылок
« Ответ #8 : 28 Ноябрь 2016, 14:04:18 »
Ну так добавь нужный шаблон имени в find:
-name 'шаблон'(*) -это реальное имя директории проекта и файлов?

Оффлайн _92

  • Автор темы
  • Любитель
  • *
  • Сообщений: 88
  • puppyrus.org
    • Просмотр профиля
    • 10021987.ru
Re: массовое создание символических ссылок
« Ответ #9 : 28 Ноябрь 2016, 14:28:39 »
find */ -name файл -printf 'ln -s %p <path>/директория0/%H_%f\n' | bash
проблема с полным путем
создается неверная ссылка _файл -> директория1/файл

(*) -это реальное имя директории проекта и файлов?
это сноска, т.е. (*) = один файл настроек плагина

Ну так добавь нужный шаблон имени в find: -name 'шаблон'
добавил
сейчас создаются в DEST_DIR верные симлинки: 1 файл, 2 файл, ..
осталось только распределять их по директориям, т.е. желаемый результат 1 или желаемый результат 2 (см. первый пост)
« Последнее редактирование: 28 Ноябрь 2016, 15:26:55 от _92 »
g4600 + ssd + ddr4

Онлайн Azure

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 5660
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Re: массовое создание символических ссылок
« Ответ #10 : 28 Ноябрь 2016, 18:23:38 »
find "$PWD"/*/ -type f -name файл | sed "s|.*\(/[^/]\+\)/\(.*\)|ln -s & $DEST_DIR\1_\2|e" >/dev/null
« Последнее редактирование: 28 Ноябрь 2016, 18:31:53 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн _92

  • Автор темы
  • Любитель
  • *
  • Сообщений: 88
  • puppyrus.org
    • Просмотр профиля
    • 10021987.ru
Re: массовое создание символических ссылок
« Ответ #11 : 29 Ноябрь 2016, 04:13:08 »
find "$PWD"/*/ -type f -name файл | sed "s|.*\(/[^/]\+\)/\(.*\)|ln -s & $DEST_DIR\1_\2|e" >/dev/null
#!/bin/bash
# first copy in the required directory or change the PWD
# PWD="/home/username/reqdirname" # full path only: ~ not works
DIR="~/destdirname"
FILE="filename.ext"
find "$PWD"/*/ -type f -name "$FILE" | sed "s|.*\(/[^/]\+\)/\(.*\)|ln -s & $DIR\1_\2|e" >/dev/null
« Последнее редактирование: 29 Ноябрь 2016, 04:34:51 от _92 »
g4600 + ssd + ddr4

 

Страница сгенерирована за 0.079 секунд. Запросов: 24.