LINUX.ORG.RU

Раскидать логи по каталогам в зависимости от даты

 ,


1

1

Есть десятки тысяч постоянно добавляющихся файлов логов с именами в виде app_id1_YYYYMMDDHHMMSS_id2 и есть каталоги вида YYYYMMDD в которые эти логи надо раскидывать для дальнейшей обработки
Файлов очень много, поэтому мучает меня любопытство о самом быстром способе сопоставления файлов по дате и перекладывании файлов в соответствующие каталоги.
Доп. ограничение: изначально файлы кладутся именно в один каталог, изменить это я не в силах.

Дополнение: Делать это нужно с минимальными задержками, то есть разбор на следующий день не подходит

★★★★★

Последнее исправление: zolden (всего исправлений: 1)
Ответ на: комментарий от Anon

Таки одним процессом будет быстрей.

вот здесь: Раскидать логи по каталогам в зависимости от даты (комментарий) в обоих примерах ОДНИМ процессом. В большинстве практических случаях xargs (которая неявно применяется в find) не будет резать строку с именами файлов, и выполнится команда

mv -t B file1 file2 file3 file4 …
с одним запуском. Такого-же результата можно добиться и в других ситуациях, если руки не из жопы.

drBatty ★★
()
Ответ на: комментарий от drBatty

Фигушки: `find` запускает внешние процессы при помощи `system`, а если аргументов дофига, то и вызовов будет много.

И вообще, у ТСа задача — выделить имя директории из имени файла, а у тебя такого нет.

Anon
()
Ответ на: комментарий от Anon

Фигушки: `find` запускает внешние процессы при помощи `system`, а если аргументов дофига, то и вызовов будет много.

man xargs прочитай пожалуйста.

И вообще, у ТСа задача — выделить имя директории из имени файла, а у тебя такого нет.

это не очень важно. Выделение чего-то там из имён — операция со строками. Можно выполнить одной командой, например sed. А полученную строку с готовыми именами отправь в тот же xargs. Плюс(+) в команде find это тот же xargs, только коротко записан, если ты хочешь сам создать кучу имён, создай явно, и потом скорми их все сразу своей xargs, которая будет их передавать команде нужными дозами.

drBatty ★★
()
Ответ на: комментарий от drBatty

Можно выполнить одной командой, например sed. А полученную строку с готовыми именами отправь в тот же xargs

и будет у тебя уйма потоков: на каждый файлик по sed'у + mv.

Anon
()
Ответ на: комментарий от Anon

Можно выполнить одной командой, например sed. А полученную строку с готовыми именами отправь в тот же xargs

и будет у тебя уйма потоков: на каждый файлик по sed'у + mv.

проанализируй вот эту команду:

find -maxdepth 1 -type f |\
sed -rn 's/.*/"&"/;H;${x;s/\n/ /gp;b}' |\
xargs cp -v -t z/
drBatty ★★
()
Ответ на: комментарий от drBatty

Если у тебя там 100500 файлов, то sed получит не все (хотя, конечно, это не беда — все равно запускать скрипт придется часто). С регулярками у меня полная беда.

И я не в курсе, что такое z/ в аргументе xargs.

Anon
()
Ответ на: комментарий от Anon

Если у тебя там 100500 файлов, то sed получит не все (хотя, конечно, это не беда — все равно запускать скрипт придется часто). С регулярками у меня полная беда.

sed получает на входе ОДИН файл, /dev/stdin. На выходе отдаёт тоже ОДИН файл /dev/stdout. Входной файл — текст из строчек, в каждой строчке одна строка. Выходной — одна текстовая строка с ИМЕНАМИ файлов, в кавычках. Сделано это просто для примера, ибо xargs умеет и просто строчки с именами жрать, но тебе же нужна была обработка? Вот она и есть. Тут закавычивает(потому нельзя в именах кавычки делать, но это просто пример, и xargs, и sed, и find умеют и с нулём в конце делать, т.ч. проблемы с символами нет).

xargs заворачивает файл в параметры(Важно! Это НЕ СТРОКА!, это именно массив строк, каждая строка — имя файла, потому там допустимы ЛЮБЫЕ символы, даже переводы строки и любые кавычки). Причём команда выполняется ОДИН раз, если все параметры влезут (а они обычно влезают, даже если их гигабайты). Если параметры все не влезут, а влезет 100500 всего, то xargs автоматически выполнит ещё ОДНУ команду, для следующих 100500 имён.

И я не в курсе, что такое z/ в аргументе xargs.

это каталог.

иди, выполни вот эту команду, и просвятляйся:

info coreutils 'Target directory'
drBatty ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.