Форум программистов, компьютерный форум, киберфорум
Shell, Bash
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
3 / 3 / 0
Регистрация: 26.07.2012
Сообщений: 122
1

Сбор уникального контента, и передача по ssh

27.07.2012, 02:30. Показов 1347. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Это моя первая тема здесь так что не бейте меня.
Появилась интересная задача над которой мне пришлось малость попотеть, но до сих пор я её так и не решил.
Задача:
Есть около 40 директорий, внутри которых тоже есть директории. Разные люди заливают туда информацию.
Мне в свою очереть нужно собирать оттуда уникальный контент и ложись его на другой сервер. При этом сохранять структуру каталогов и подкаталогов.
И да при минимальной затрате ресурса, ибо там сотня гигов.
Я это решил сделать так :
1. Копировать файлы определенного расширения (ибо нам действительно не нужно все)
2. Копировать файлы залитые за последний час (заливается через ftp но это роли не играет)
3. Не заменять файлы на более новые (то есть, если в базе есть файл rassol2.txt и нам кто то залил его, та мы при копировании в базу пропускаем его)
3. Выполнять этот скрипт каждый час.
4. Выполнять процеcс с низким приоритетом nice -n 10
Для сбора информация нашел 2 пути: rsync , find + cp но в каждом из них у меня есть непонятки. (о них ниже)

Примеры:
Тестирую локально, и у меня кроме сервера игры не было ни одной директории с кучей файлов разных расширений, и я начал тестить на нем.
Вариант под кодовым именем rsync
Bash
1
2
3
4
5
6
7
8
#!/bin/bash 
# Серезный шаг Rassol2 
 
# Переменные 
dir1='/home/rassol2/doc/test/cs**d/cstrike'
dir2='/home/rassol2/doc/test/dw/'
# Выполнение 
nice -n 10 rsync -r -f "+ */" -f "+ **.wad" -f "+ **.bsp" -f "+ **.res" -f "+ **.mdl" -f "+ **.spr" -f "+ **.tga" -f "+ **.wav" -f "+ **.mp3" -f "- *" $dir1 $dir2
То есть мы получим :
Код
rassol2@linux:~/doc/test/dw/cstrike$ ls -l
итого 54992
drwxr-xr-x  6 rassol2 rassol2    4096 2012-07-26 19:22 addons
-rw-r--r--  1 rassol2 rassol2   48456 2012-07-26 19:23 ajawad.wad
-rw-r--r--  1 rassol2 rassol2    2108 2012-07-26 19:23 autobuy.txt
-rw-r--r--  1 rassol2 rassol2  129636 2012-07-26 19:23 cached.wad
-rw-r--r--  1 rassol2 rassol2 7706996 2012-07-26 19:23 chateau.wad
drwxr-xr-x  2 rassol2 rassol2    4096 2012-07-26 19:23 classes
drwxr-xr-x  2 rassol2 rassol2    4096 2012-07-26 19:22 cl_dlls
-rw-r--r--  1 rassol2 rassol2    8597 2012-07-26 19:23 commandmenu.txt
-rw-r--r--  1 rassol2 rassol2 2911764 2012-07-26 19:23 cs_747.wad
-rw-r--r--  1 rassol2 rassol2  517360 2012-07-26 19:23 cs_assault.wad
-rw-r--r--  1 rassol2 rassol2 5832260 2012-07-26 19:23 cs_bdog.wad
-rw-r--r--  1 rassol2 rassol2 1812356 2012-07-26 19:23 cs_cbble.wad
-rw-r--r--  1 rassol2 rassol2 1055884 2012-07-26 19:23 cs_dust.wad
-rw-r--r--  1 rassol2 rassol2 3405860 2012-07-26 19:23 cs_office.wad
-rw-r--r--  1 rassol2 rassol2  161368 2012-07-26 19:23 cstraining.wad
-rw-r--r--  1 rassol2 rassol2 2681364 2012-07-26 19:23 cstrike.wad
-rw-r--r--  1 rassol2 rassol2 4410248 2012-07-26 19:23 de_airstrip.wad
-rw-r--r--  1 rassol2 rassol2 1305468 2012-07-26 19:23 de_aztec.wad
-rw-r--r--  1 rassol2 rassol2  960012 2012-07-26 19:23 decals.wad
-rw-r--r--  1 rassol2 rassol2 5514532 2012-07-26 19:23 de_piranesi.wad
-rw-r--r--  1 rassol2 rassol2 4187008 2012-07-26 19:23 de_storm.wad
-rw-r--r--  1 rassol2 rassol2  620486 2012-07-26 19:23 de_vertigo.wad
drwxr-xr-x  2 rassol2 rassol2    4096 2012-07-26 19:22 dlls
drwxr-xr-x  2 rassol2 rassol2    4096 2012-07-26 19:22 events
drwxr-xr-x  5 rassol2 rassol2    4096 2012-07-26 19:23 gfx
drwxr-xr-x  2 rassol2 rassol2    4096 2012-07-26 19:22 iga_static
-rw-r--r--  1 rassol2 rassol2 2469516 2012-07-26 19:23 iga_static.wad
-rw-r--r--  1 rassol2 rassol2 1856328 2012-07-26 19:23 itsitaly.wad
drwxr-xr-x  2 rassol2 rassol2    4096 2012-07-26 19:22 manual
-rw-r--r--  1 rassol2 rassol2      36 2012-07-26 19:23 mapcycle.txt
drwxr-xr-x  2 rassol2 rassol2    4096 2012-07-26 19:23 maps
drwxr-xr-x  4 rassol2 rassol2    4096 2012-07-26 19:23 models
-rw-r--r--  1 rassol2 rassol2     351 2012-07-26 19:23 motd.txt
-rw-r--r--  1 rassol2 rassol2  147184 2012-07-26 19:23 n0th1ng.wad
drwxr-xr-x  2 rassol2 rassol2    4096 2012-07-26 19:23 overviews
-rw-r--r--  1 rassol2 rassol2   34340 2012-07-26 19:23 prodigy.wad
-rw-r--r--  1 rassol2 rassol2   29433 2012-07-26 19:23 readme.txt
-rw-r--r--  1 rassol2 rassol2    1550 2012-07-26 19:23 rebuy.txt
drwxr-xr-x  4 rassol2 rassol2    4096 2012-07-26 19:23 resource
drwxr-xr-x  2 rassol2 rassol2    4096 2012-07-26 19:22 SAVE
drwxr-xr-x 13 rassol2 rassol2    4096 2012-07-26 19:23 sound
-rw-r--r--  1 rassol2 rassol2    1176 2012-07-26 19:23 spectatormenu.txt
-rw-r--r--  1 rassol2 rassol2     755 2012-07-26 19:23 spectcammenu.txt
drwxr-xr-x  3 rassol2 rassol2    4096 2012-07-26 19:23 sprites
-rw-r--r--  1 rassol2 rassol2       2 2012-07-26 19:23 steam_appid.txt
-rw-r--r--  1 rassol2 rassol2   25390 2012-07-26 19:23 titles.txt
-rw-r--r--  1 rassol2 rassol2 6783060 2012-07-26 19:23 torntextures.wad
-rw-r--r--  1 rassol2 rassol2 1555168 2012-07-26 19:23 tswad.wad
rassol2@linux:~/doc/test/dw/cstrike$
Как раз так и должно быть. Но как сделать что бы отсеивало еше все файлы что были залиты больше 1 часа назад ?

Вариант под кодовым именем find + cp
Bash
1
nice -n 19 find /home/rassol2/doc/test/cs**/ \( -name "**.wad" -o -name "**.bsp" -o -name "**.res" -o -name "**.mdl" -o -name "**.spr" -o -name "**.txt" -o -name "**.tga" -o -name "**.wav" -o -name "*.mp3" \) -a -mtime -60 -exec cp --parents -v -t /home/rassol2/doc/test/dw/ {} +
И получаем мы в итоге такую структуру
Код
/home/rassol2/doc/test/dw/home/rassol2/doc/test/cs01d/cstrike/ну и все отсальное
                                               /cs02d/cstrike/ну и все отсальное
                                               /cs03d/cstrike/ну и все отсальное
а нужно объединить как вы поняли. в одной директории.
Ну затем я уже передам данные на другой дед при помоoи scp

мне не нужно готовое решение, мне нужен конкретный путь к решению, пожалуйста не пишите мне man find, man rsync , man cp уже много прочитал. Луче тыкните как котенка.
Также я пока искал решение задачи мне советовали создавать md5 суммы и сравнивать, но пока что ума не хватает.

Рад услышать ваши варианты решения задачи, открыт для нового и познавательного. Зарание извиняюсь что так изложил свою задачу, и надеюсь вы поймете.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.07.2012, 02:30
Ответы с готовыми решениями:

Влияние уникального контента...
Какое влияние имеет уникальный контент пусть даже и не оптимизированного, на выдачу в поисковике....

Можно ли повысить рейтинг без уникального контента?
Доброго времени суток. Часто слышно что чем больше статей и уникального контента на сайте, тем выше...

Передача ssh сессии
Добрый день Мне необходимо открыть Putty, зайти в нужную дирректорию, выполнить некие команды, а...

Сбор и передача данных электросети на удаленный ПК
Добрый день. Вопрос собственно на половину раскрыт в названии темы. Конкретней: - есть...

15
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
27.07.2012, 04:08 2
сначала выведи на экран все файлы, которые будут скопированы

Цитата Сообщение от Rassol2 Посмотреть сообщение
3. Не заменять файлы на более новые (то есть, если в базе есть файл rassol2.txt и нам кто то залил его, та мы при копировании в базу пропускаем его)
есть программа cmp, которая сравнивает содержимое файлов

Цитата Сообщение от Rassol2 Посмотреть сообщение
3. Выполнять этот скрипт каждый час.
сначала делаешь скрипт, а потом подключаешь его к планировщику cron


1. найти все файлы по дате изменения
2. выбрать из них нужные по расширению
3. искать выбранные в получателе, удаляя дубликаты
4. создать несуществующие каталоги
5. скопировать файлы
0
3 / 3 / 0
Регистрация: 26.07.2012
Сообщений: 122
27.07.2012, 05:35  [ТС] 3
есть программа cmp, которая сравнивает содержимое файлов
Извиняюсь я не так выразился. Даже если они разные мне заминать их не нужно. То есть если есть файл с таким именем то его пропускаем. В любом случаи. Да и сам rsync неплохо выполняет проверки файлов.
начала делаешь скрипт, а потом подключаешь его к планировщику cron
ну это понятно.

Я понял что не так выразился.
суть вопроса в том как сделать в варианте find + cp копирование все уникальных файлов с директорий cs01d cs02d cs03d cs04d cs05d cs06d ...
в директорию csAlld при этом сохранить архитектуру директорий, и их содержимого.

Пример:
есть директория cs01d в ней есть папка 1 в которой есть файлs rassol, rassol2, rassol3
есть директория cs02d в ней есть папка 2 в которой есть файлs dima, dima2, dima3
есть директория cs03d в ней есть папка 1 в которой есть файлs ubuntu, ubuntu2, ubuntu3

после выполнения скрипта мы должны получить на выходе:
Директория csAlld/1 с содержимым rassol, rassol2, rassol3, ubuntu, ubuntu2, ubuntu3
рядом с папкой 1 должна быть вторая папка csolld/2 с содержимым ubuntu, ubuntu2, ubuntu3

если проследить то видно что изначально было 3 разных места с файлами, а на выходе мы получаем один в котором собран уникальный контент.

Моего лексического запаса не хватает что бы описать задачу.
Но если кто то захочет вникнуть и помочь вы можете выполнить вот это
Bash
1
2
3
4
dir1='/home/rassol2/doc/test/cs**d/cstrike'
dir2='/home/rassol2/doc/test/dw/'
# Выполнение 
nice -n 10 rsync -r -f "+ */" -f "+ **.wad" -f "+ **.bsp" -f "+ **.res" -f "+ **.mdl" -f "+ **.spr" -f "+ **.tga" -f "+ **.wav" -f "+ **.mp3" -f "- *" $dir1 $dir2
тока поправьте расширений файлов ну и адрес. И тогда вы поймете.
Нужно добиться тот же результат тока при помощи find + cp

1. найти все файлы по дате изменения
2. выбрать из них нужные по расширению
3. искать выбранные в получателе, удаляя дубликаты
4. создать несуществующие каталоги
5. скопировать файлы
И наверное было бы луче так:
1. Искать все файлы за последний час
2. Выбирать из них нудные по расширению
3. Копировать их, и при копировании указать ключ без замены.
4. копирование в свою очередь создаст каталоги.

PS. Как запускать периодичное выполнение я знаю. У меня просто проблема с ключами в find и cp как правило в манах не все рассмотрено. И то что я написал это исходя из того что нарыл.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
27.07.2012, 07:33 4
Bash
1
2
3
4
srcdir="/home/rassol2/doc/test/cs??d"
dstdir="/home/rassol2/doc/test/dw"
 
find $srcdir -type f -mmin -60 -exec echo {} \;
дальше надо эти пути переделывать

Добавлено через 12 минут
Bash
1
2
3
4
5
6
7
srcdir="/home/rassol2/doc/test/cs??d"
dstdir="/home/rassol2/doc/test/dw"
 
for f in $(find $srcdir -type f -mmin -60); do
    newpath=$(echo "$f" | sed "s,.*/cs..d/,csAlld/,")
    cp "$f" "$dstdir/$newpath"
done
1
3 / 3 / 0
Регистрация: 26.07.2012
Сообщений: 122
27.07.2012, 10:45  [ТС] 5
у меня пока что знания на уровни любопытного пользователя и поэтому я несильно понял ваш код. Не могли бы вы дать пару разъяснений что бы я мог его добить?
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
27.07.2012, 12:01 6
там нужно ещё фильтрануть расширения через grep, расширения должны задаваться в переменной

суть в том, что он сначала получает пути нужных файлов, а потом для каждого из них создаёт путь, куда тот будет копироваться

если был /home/rassol2/doc/test/cs01d/file.txt
то он станет csAlld/file.txt
и копироваться он будет в /home/rassol2/doc/test/dw/csAlld/file.txt

(можешь закомментировать копирование через cp, и просто через echo вывести аргументы для cp, чтобы видеть результат)

Добавлено через 32 минуты
копирование через cp для несуществующих каталогов не будет работать, их надо сначала создать
0
3 / 3 / 0
Регистрация: 26.07.2012
Сообщений: 122
28.07.2012, 01:38  [ТС] 7
а нету просто ключа для cp который будет копировать как надо ?
а то ключ --parents не совсем так работает.
accept, а ваш вариант вообще не могу понять

Bash
1
for f in $(find $srcdir -type f -mmin -60); do
Тут мы задали параметр поиска. И как туда добавить расширение файлов я непойму.
Bash
1
newpath=$(echo "$f" | sed "s,.*/cs..d/,csAlld/,")
тут вообше потерляся, зачем sed ? И вообще та строка мне непонятна.
Bash
1
    cp "$f" "$dstdir/$newpath"
Здесь почувствовал руку мастера и понял что это копирование тока что это за ключ "$f"
И откуда взялся параметр $newpath если мы задавали только
Bash
1
2
srcdir="/home/rassol2/doc/test/cs??d"
dstdir="/home/rassol2/doc/test/dw"
конечно понимающие люди наверное все поняли, а для меня это все загадка.

Добавлено через 2 минуты
ааа.
Bash
1
 newpath=$(echo "$f" | sed "s,.*/cs..d/,csAlld/,")
тут мы создали параметр, и сед нам был нужен что бы определить место положения каждого файла, верно ?
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
28.07.2012, 06:35 8
Bash
1
2
3
4
5
6
7
8
9
10
11
12
srcdir="/home/rassol2/doc/test"
dstdir="/home/rassol2/doc/test/dw"
extpat="wad\|bsp\|res" 
 
for pathfrom in $(find "$srcdir"/cs??d -type f -mmin -60 | \
                  grep "\.\($extpat\)$"); do
    pathto="$dstdir/csAlld/${pathfrom#*/cs??d/}"
    if [ ! -f "$pathto" ]; then
        mkdir -p "$(dirname "$pathto")"
        cp "$pathfrom" "$pathto"
    fi
done
Добавлено через 15 минут
Цитата Сообщение от Rassol2 Посмотреть сообщение
а то ключ --parents не совсем так работает.
его может вообще не быть в cp, которая входит в POSIX
а rsync даже в POSIX не входит

Цитата Сообщение от Rassol2 Посмотреть сообщение
тут вообше потерляся, зачем sed ?
sed изначально использовал, потому что думал, что там возможно придётся в середину пути изменение вносить, то есть понадобятся слеши
поменял на простое отрезание слева, так как оно к слешам индифирентно

Цитата Сообщение от Rassol2 Посмотреть сообщение
тока что это за ключ "$f"
f - это не ключ, а обычная переменная

Цитата Сообщение от Rassol2 Посмотреть сообщение
И откуда взялся параметр $newpath если мы задавали только
там, где присваивание (знак =), он создаётся

Цитата Сообщение от Rassol2 Посмотреть сообщение
и сед нам был нужен что бы определить место положения каждого файла
sed'ом составили часть пути, заменив любую из папок с числами на папку с общим названием
0
3 / 3 / 0
Регистрация: 26.07.2012
Сообщений: 122
28.07.2012, 23:44  [ТС] 9
Мне неясно как это работает по этому тестировал.
при запуске :
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash -x
srcdir="/home/rassol2/doc/test"
dstdir="/home/rassol2/doc/test/dw"
extpat="wad\|bsp\|res" 
 
for pathfrom in $(find "$srcdir"/cs??d -type f -mmin -60 | \
                  grep "\.\($extpat\)$"); do
    pathto="$dstdir/csAlld/${pathfrom#*/cs??d/}"
    if [ ! -f "$pathto" ]; then
        mkdir -p "$(dirname "$pathto")"
        cp "$pathfrom" "$pathto"
    fi
done
 
sleep 10
Мы получаем.
Bash
1
2
3
4
5
6
+ srcdir=/home/rassol2/doc/test
+ dstdir=/home/rassol2/doc/test/dw
+ extpat='wad\|bsp\|res'
++ find /home/rassol2/doc/test/cs01d /home/rassol2/doc/test/cs02d /home/rassol2/doc/test/cs03d -type f -mmin -60
++ grep '\.\(wad\|bsp\|res\)$'
+ sleep 10
+ sleep 10 добавил что бы успеть рассмотреть что там да как. И судя с рассмотрелки почему то cp не происходит. Причина тоже неясна мне.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
29.07.2012, 04:44 10
поставь echo "$pathfrom" внутри цикла
0
3 / 3 / 0
Регистрация: 26.07.2012
Сообщений: 122
31.07.2012, 02:51  [ТС] 11
емм.. А как понять внутр цикла ?
Я просто не совсем программист делаю это для развлечения..
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
31.07.2012, 02:58 12
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
srcdir="/home/rassol2/doc/test"
dstdir="/home/rassol2/doc/test/dw"
extpat="wad\|bsp\|res" 
 
for pathfrom in $(find "$srcdir"/cs??d -type f -mmin -60 | \
                  grep "\.\($extpat\)$"); do
    echo "$pathfrom"
    pathto="$dstdir/csAlld/${pathfrom#*/cs??d/}"
    if [ ! -f "$pathto" ]; then
        mkdir -p "$(dirname "$pathto")"
        cp "$pathfrom" "$pathto"
    fi
done
так ты увидишь, находит ли он файлы

Цитата Сообщение от Rassol2 Посмотреть сообщение
И судя с рассмотрелки почему то cp не происходит. Причина тоже неясна мне.
скорее всего, нет файлов, нужно сделать touch
1
3 / 3 / 0
Регистрация: 26.07.2012
Сообщений: 122
31.07.2012, 03:43  [ТС] 13
да вы правы
Bash
1
find ./cs**d -type f -exec touch -m -t 201207310229 {} \;
Затем ваш скрипт
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
srcdir="/home/rassol2/doc/test"
dstdir="/home/rassol2/doc/test/dw"
extpat="wad\|bsp\|res\|txt" 
 
for pathfrom in $(find "$srcdir"/cs??d -type f -mmin -60 | \
                  grep "\.\($extpat\)$"); do
    pathto="$dstdir/csAlld/${pathfrom#*/cs??d/}"
    if [ ! -f "$pathto" ]; then
        mkdir -p "$(dirname "$pathto")"
        cp "$pathfrom" "$pathto"
    fi
done
 
sleep 10
и все скопировало как нужно.
и директории и все остальное.
вот тока мне не удается познать как это вышло. Мы для этого использовали cp, find, mkdir, grep.

вот на словах что происходит то ?
Мы чекаем определенную директорию на наявность файлов которые подходят по описанию.
Время
формат
затем мы создаем соответствующие директории в нужном нам каталоге, и копируем туда файлы.

grep что делает в этом всем ?
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
31.07.2012, 04:18 14
Цитата Сообщение от Rassol2 Посмотреть сообщение
Мы чекаем определенную директорию на наявность файлов которые подходят по описанию.
Время
формат
не формат, а просто все файлы, но не каталоги, каналы, сокеты и так далее

Цитата Сообщение от Rassol2 Посмотреть сообщение
grep что делает в этом всем ?
grep из полученного списка строк, где каждая строка - путь к файлу, оставляет только строки, подходящие под регулярное выражение
регулярное выражение совпадает со строками, которые заканчиваются на .<расширение><конец строки>
<расширение> ::= wad | bsp | res | txt
1
3 / 3 / 0
Регистрация: 26.07.2012
Сообщений: 122
31.07.2012, 05:59  [ТС] 15
а вот тут если не тяжело.
Bash
1
 pathto="$dstdir/csAlld/${pathfrom#*/cs??d/}"
Здесь что происходит ?
получается pathto создается эта переменная. В которой это $dstdir/csAlld/ путь до нового места хранения данных.
а вот что это /${pathfrom#*/cs??d/}" ? предположительно както там чекается название файлов и директорий, дописывается до dstdir/csAlld/ и туда уже падают файлы.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
31.07.2012, 09:00 16
Цитата Сообщение от Rassol2 Посмотреть сообщение
а вот что это
у переменной pathfrom слева # удаляется короткая группа символов по маске */cs??d/
* - любое количество любых символов
? - один любой символ
1
31.07.2012, 09:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.07.2012, 09:00
Помогаю со студенческими работами здесь

Обновление контента, передача информации в js
Здравствуйте, как можно вывести определенные данные из БД в блок. Есть код function sendmes() {...

Как сделать, чтобы ssh-клиент использовал файл ~/.ssh/config?
centos ssh клиент не использует файл ~/.ssh/config для подгрузки хостов. за место этого, он...

Как изменить ssh ключ локального репозитория, что бы был он, а не id.rsa из папки .ssh?
Как изменить ssh ключ локального репозитория, что бы был он, а не id.rsa из папки .ssh? Просто у...

После обновления контента <div> через AJAX перестают работать события данного контента
Здравствуйте. Есть проблемка такого характера. На сайте выбирается студент и в поля ввода читаются...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru