16.03.2013 04:09
KirillHome
 
Есть Nas Synology, на котором лежит большой каталог с кучей подкаталогов с файлами (т.н. библиотека Траума).
К Nas есть доступ по telnet.

Хочу сделать hardlink-и на определённые типы файлов в данном каталоге (*.fb2.zip) (symlink-и - видны только при "общении" с NAS по telnet, не видны ни в Web-интерфейсе, ни в при просмотре устройства через smb).

Т.к. знаний (и уж тем паче опыта) работы с nix-системами, увы, 0 - то пока не понимаю, как это ... правильно сделать.

Создаю структуру каталогов
Код:
ls TraumAll -FR | grep ':' | sed 's/://g' | sed 's/TraumAll/mkdir "TraumRead/g' | sed 's/\$/\\$/' | sed 's/$/"/' | sh
из TraumAll в TraumRead

Делаю hardlink на файлы типа *.fb2.zip
Код:
find TraumAll -name '*.fb2.zip' |   ''Получил список файлов
sed 's/TraumAll/"TraumAll/g' |      ''поставил кавычку (") в начале строки
sed 's/\$/\\$/g' |                  ''Экранирую знак $ в названии
sed 's/$/"/' |                      ''поставил кавычку (") в конце строки
sed 's/[ -я]*/& &/g' |              ''"Задвоил" имя файла 
sed 's/"TraumAll/ln "TraumAll/1' |  ''поставил в начале строки ln
sed 's/TraumAll/TraumRead/2' |      ''поменял во "втором" имени файла каталог назначения
sh
Что не нравится - как то очень "тяжеловесно" получилось (особенно с добавлением двойных кавычек перед началом имени каталога и с добавлением их в конце, задвоением имени файла).

Что совсем не нравится - это то, что я создаю "лишние" каталоги.
Т.е., если в каком-либо исходящем каталоге/подкаталоге не будет файлов нужного мне типа, он (это каталог) всё равно будет создан.

Чего жду:
1) Подсказки - как правильно создавать каталоги, не создавая лишних, и не пытаясь создать нужный каталог перед каждым созданием hardlink-а?
2) Доброй критики :) о направлении мыслей/действий.
16.03.2013 08:50
OlegON
 
К сожалению, не знаком ни с Траумом, ни с его библиотекой, хотя, конечно, погуглил и общее представление получил, что это такое.
У меня Хранилище тоже лежит на NAS и я вынес его в веб одним симлинком, ту часть, которую надо было вынести. Подозреваю, что у тебя в NAS убогий апач, поэтому, если ты планируешь показать его локалке, то велика вероятность, что NAS тебе положат. Там на немного пользователей расчет, опять же "как правило, предполагаю, как у меня". Но симлинки там есть, посмотри по слову FollowSymLinks в конфиге апача. Если не согласен, то немного лениво разгребать скрипт, было бы здорово, если бы ты сразу написал строку начальную и во что ты ее хочешь превратить.
16.03.2013 12:43
OlegON
 
Не успеваю доделать, но если то, что я понял, то строка будет вроде такой

Цитата:
find /storage/forum/supermag/upload -name '*.zip' -type f -exec echo "ln "{}" "`ss="{}"; echo "${ss/storage/nas}"` \;
про замену строк вот эта статейка понравилась: http://www.thegeekstuff.com/2010/07/bash-string-manipulation/
16.03.2013 14:45
KirillHome
 
Получил вот такого "зверя"

Код:
ls TraumAll -FR | grep ':' | sed 's/://g'      ##Получил имя каталога
| sed 's/TraumAll/"TraumAll/1'                 ##Поменял в начале TraumAll на "TraumAll
| sed 's/\$/\\$/g'                             ##Экранировал знак $ в названии
| sed 's/$/\/"/'                               ##Поставли в конце строки [имени каталога] ($) кавычку "
| sed 's/[ -я]*/& & &/g'                       ##Затроил получившуюся строку
| sed 's/"TraumAll/mkdir "TraumRead/1'         ##Поменял начало строки с ("TraumAll)  на (mkdir "TraumRead)
                                               ## т.е. будем создавать там новый каталог в TraumRead
                                               ## Первая команда - оформлена
|  sed 's/"TraumAll/ln "TraumAll/1'            ##Поменял теперь уже первое вхождение ("TraumAll) на (ln "TraumAll)
                                               ## отсюда - будем делать hardlink
| sed 's/" "TraumAll/"*.fb2.zip "TraumRead/1'  ##Заменил (" "TraumAll) - по сути, начало уже третьего наименования 
                                               ## каталога, на ("*.fb2.zip "TraumRead) - т.е. прилепил ко второй части
                                               ## с каких файлов мы будем делать hardlink - *.fb2.zip и куда -
                                               ## в TraumRead
| sed 's/"/" ;/2'                              ## поставили после второй кавычки (;) - разделили команды
                                               ## mkdrir и ln
| sed 's/$/ 2>\/dev\/nul/'                     ## в конце строки ($) перенаправили вывод ошибок второй команды - ln
                                               ##  в /dev/nul [не забывая о зеркалировании]
| sh                                           ##Запустили результат на выполнение
т.е. я, по сути, из "строки" (к примеру)
TraumAll/ru/_/_худлит/_приключения/Приключения года/
получаю следующее:
mkdir "TraumRead/ru/_/_худлит/_приключения/Приключения года/";
ln "TraumAll/ru/_/_худлит/_приключения/Приключения года/"*.fb2.zip "TraumRead/ru/_/_худлит/_приключения/Приключения года/"

Что меня не устраивает.
К примеру, есть каталог - TraumAll/ru/S/Sh Андрей/ - в котором нет файлов типа *.fb2.zip.
Но при выполнении данного скрипта - он создаётся.
Да, конечно, я потом могу его найти и удалить (на сколько я понял - примерно так find TraumRead/ -type d -empty - пока только читал, не пробовал) - но это дополнительный довольно долгий обход (или не долгий - пока не проверял :)).
В любом случае - дополнительное действие - сначала создание, потом удаление, что как-то ... не правильно.


Хотя пока - я уже доволен результатом.
Скрипт отработал за 50 минут.
Обработано 188'504 файла в 39'209 каталогах (общий размер библиотеки 149'903'597'626 байт, почти 140Гб)
Сделаны hardlink-и на 162'055 файлов.
По идее - экономия за счёт разницы между копией и hardlink-ом составила 65'429'206'527 байт (почти 61Гб)

По поводу аппача - честно не понял - что и куда смотреть.
16.03.2013 15:45
OlegON
 
В апаче (вебсервере, конфиг заранее сохрани перед правками, он где-то в /etc/) как раз суть более простого решения. А именно - разрешить ходить по симлинкам и запретить показывать часть файлов (если надо)... Никаких скриптов вообще не надо. Если бы nginx, я бы тебе сразу и написал, как это сделать, но в апаче придется погуглить.
16.03.2013 16:03
KirillHome
 
Если честно - сейчас уже ничего не соображаю.

Смотрю на результат dir /etc/:

Код:
drwxr-xr-x   19 root     root          4096 Mar  7 07:57 .
drwxr-xr-x   24 root     root          4096 Mar  6 23:27 ..
-rw-r--r--    1 root     root             6 Mar  6 11:01 TZ
-rwxr-xr-x    1 root     root            91 Dec 11 16:40 VERSION
-rw-r--r--    1 root     root            96 Mar  6 11:01 crontab
-rw-------    1 root     root           106 Mar  6 11:04 ddns.conf
-rwxr-xr-x    1 root     root          3150 Dec 11 16:41 ddns_provider.conf
drwxr-xr-x    2 root     root          4096 Feb 26 23:02 defaults
drwxr-xr-x    2 root     root          4096 Mar  6 18:39 dhcpc
-rw-------    1 root     root             0 Mar  3 00:56 exports
drwxr-xr-x    2 root     root          4096 Mar  2 21:38 firewall
-rw-r--r--    1 root     root           255 Mar  6 18:40 fstab
-rw-r--r--    1 root     root            27 Jan 23 19:38 ftpusers
drwxr-xr-x    3 root     root          4096 Mar  6 11:03 fw_security
-rw-r--r--    1 root     root           227 Mar  6 11:04 group
-rw-rw-rw-    1 root     root           227 Mar  3 00:43 group.cps
-rw-rw-rw-    1 root     root            94 Mar  3 00:43 group_desc
-rw-r--r--    1 root     root            17 Sep 13  2012 host.conf
drwxr-xr-x    3 root     root          4096 Mar  6 11:03 hostapd
-rw-r--r--    1 root     root            61 Mar  2 20:37 hosts
-rw-r--r--    1 root     root           161 Sep 13  2012 hosts.allow
-rw-r--r--    1 root     root           347 Sep 13  2012 hosts.deny
-rwxr-xr-x    1 root     root          3580 Mar  1 07:10 idmapd.conf
-rw-r--r--    1 root     root           209 Mar  6 18:40 inetd.conf
-rwxr-xr-x    1 root     root          5235 Sep 13  2012 installer.sh
drwxr-xr-x    2 root     root          4096 Feb 26 23:02 iscsi
-rw-r--r--    1 root     root          1464 Mar  6 11:01 localtime
drwxr-xr-x    5 root     root          4096 Mar  6 11:03 lvm
-rwxr-xr-x    1 root     root           837 Dec 11 16:42 mke2fs.conf
-rw-r--r--    1 root     root           402 Mar  6 18:40 mtab
-rwxr-xr-x    1 root     root           767 Mar  1 07:10 netconfig
-rwxr-xr-x    1 root     root          2485 Sep 13  2012 newdisk.sh
-rw-r--r--    1 root     root           283 Sep 13  2012 nsswitch.conf
-rw-r--r--    1 root     root           299 Dec 11 16:49 nsswitch.conf.domain
-rw-r--r--    1 root     root           283 Dec 11 16:49 nsswitch.conf.workgroup
-rwxr-xr-x    1 root     root           171 Mar  6 11:01 ntp.conf
drwxr-xr-x    2 root     root          4096 Mar  6 11:03 pam.d
-rw-rw-rw-    1 root     root           804 Mar  7 07:57 passwd
drwxr-xr-x    3 root     root          4096 Mar  3 03:09 portforward
drwxr-xr-x    2 root     root          4096 Mar  6 11:03 ppp
-rw-r--r--    1 root     root           451 Sep 13  2012 profile
-rw-r--r--    1 root     root           398 Sep 13  2012 protocols
drwxrwxrwx    3 root     root          4096 Feb 27 16:08 raid
-rwxr-xr-x    1 root     root         19128 Feb  8 12:01 rc
-rwxr-xr-x    1 root     root         33520 Jan 29 08:00 rc.network
-rwxr-xr-x    1 root     root           332 Jan 23 19:38 rc.network_routing
-rwxr-xr-x    1 root     root          3847 Sep 13  2012 rc.scanusbdev
-rw-r--r--    1 root     root         14945 Dec 11 16:39 rc.subr
-rwxr-xr-x    1 root     root          5145 Sep 18 08:01 rc.volume
-rw-r--r--    1 root     root            22 Feb 26 23:02 resolv.conf
-rw-r--r--    1 root     root           332 Feb 26 23:02 rsyncd.conf
-rw-r-----    1 root     smmsp           37 Feb 26 23:02 rsyncd.secrets
-rw-r--r--    1 root     root           149 Sep 13  2012 securetty
drwxr-xr-x    2 root     root          4096 Feb 26 23:02 security
-rw-r--r--    1 root     root         20216 Sep 13  2012 services
-rw-------    1 root     root           564 Mar  7 07:57 shadow
-rw-r--r--    1 root     root            98 Sep 13  2012 shells
drwx------    2 root     root          4096 Mar  6 18:40 space
drwxr-xr-x    2 root     root          4096 Mar  6 11:03 ssh
-rw-r--r--    1 root     root           577 Dec 11 16:43 support_ssd.db
-rw-rw-rw-    1 root     root           294 Mar  7 07:57 synoappprivilege.conf
-rwxr-xr-x    1 root     root          8452 Dec 11 16:42 synogrinst.sh
-rw-r--r--    1 root     root          5768 Mar  7 07:57 synoinfo.conf
-rw-r--r--    1 root     root            17 Feb 27 17:54 synolocalbkp.conf
-rw-------    1 root     root           474 Feb 26 23:02 synolog.conf
-rw-r--r--    1 root     root             0 Dec 11 16:42 synonetbkp.conf
-rwxr-xr-x    1 root     root           217 Dec 11 16:40 synopackageslimit.conf
-rwxr-xr-x    1 root     root           294 Dec 11 16:41 synosyslog.conf
-rw-rw-rw-    1 root     root           142 Mar  7 07:57 synouser.conf
drwxr-xr-x    5 root     root          4096 Mar  6 11:01 sysconfig
-rw-r--r--    1 root     root            15 Dec 11 16:39 sysctl.conf
-rw-r--r--    1 root     root           213 Sep 13  2012 syslog.deny
drwxr-xr-x    2 root     root          4096 Mar  6 11:03 tc
-rw-r--r--    1 root     root          2773 Sep 13  2012 termcap
-rw-r--r--    1 root     root           288 Dec 11 16:42 tunnel_broker_list.conf
-rwxr-xr-x    1 root     root          8932 Dec 11 16:09 upgrade.sh
drwxr-xr-x    2 root     root          4096 Feb 26 23:02 wide-dhcpv6
-rw-r--r--    1 root     root            29 Mar  2 11:56 yp.conf
-rw-r--r--    1 root     root            29 Feb 26 23:02 yp.conf.sv

и пока даже не вижу - на что смотреть...
Через какое-то время вернусь к этому.
Любопытно же :)
Часовой пояс GMT +3, время: 10:12.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.