Поиск и архивирование множества файлов

На самом деле это единственный раздел про unix на этом форуме

Модератор: /dev/random

Аватара пользователя
toboe
Сообщения: 79
ОС: Fedora 10

Поиск и архивирование множества файлов

Сообщение toboe » 30.07.2015 05:46

Добрый день!

Есть нетривиальная задача, архивация файлов по месту их нахождения. Тут вроде как все просто...

Код: Выделить всё

find $DIR_PATH -type f -name "*.ext1" -exec gzip {} \;


Проблема в том, что gzip утыкается в ограниченное кол-во открытых файлов и выдает ошибку

Код: Выделить всё

gzip: ./filename.ext1.gz: Too many open files
gzip: error while loading shared libraries: libc.so.6: cannot open shared object file: Error 24
find: Failed to save working directory in order to run a command on `ilename.ext1.gz': Too many open files


Самое интересное, что тот же zip спокойно обрабатывает это кол-во файлов (более 10 тысяч) без ошибок. Отказались от него в угоду упрощения кода скрипта (gunzip без лишних проблем разжимает архив в том же месте и удаляет исходный файл).

Вариантов я вижу два - вернуться на zip/unzip и добавить лишнюю строку кода с удалением исходного архива при разархивировании, либо увеличить лимит одновременно открытых файлов (не совсем правильное решение, как мне кажется).
MSI Mega BOOK M520b, Intel Pentium M 740 1.73 GHz, VGA compatible controller: Intel Corporation Mobile 915GM, 1.0 Gb ОЗУ, 80Gb Hdd
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15835
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Поиск и архивирование множества файлов

Сообщение Bizdelnick » 30.07.2015 08:26

А если так?
find "$DIR_PATH" -type f -name "*.ext1" -print0 | xargs -0 gzip
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
nerve
Сообщения: 267
ОС: OpenBSD

Re: Поиск и архивирование множества файлов

Сообщение nerve » 30.07.2015 09:37

или так

Shell

find $DIR_PATH -type f -name "*.ext1" -exec gzip {} +


Спасибо сказали:

Аватара пользователя
toboe
Сообщения: 79
ОС: Fedora 10

Re: Поиск и архивирование множества файлов

Сообщение toboe » 30.07.2015 11:08

Bizdelnick писал(а):
30.07.2015 08:26
А если так?
find "$DIR_PATH" -type f -name "*.ext1" -print0 | xargs -0 gzip


Спасибо этот вариант действительно работает :) Правда медленнее, но вопрос не критичен..

nerve писал(а):
30.07.2015 08:26
или так
.
ind $DIR_PATH -type f -name "*.ext1" -exec gzip {} +


а что дает "+" в этой конструкции?
MSI Mega BOOK M520b, Intel Pentium M 740 1.73 GHz, VGA compatible controller: Intel Corporation Mobile 915GM, 1.0 Gb ОЗУ, 80Gb Hdd
Спасибо сказали:

Аватара пользователя
nerve
Сообщения: 267
ОС: OpenBSD

Re: Поиск и архивирование множества файлов

Сообщение nerve » 30.07.2015 11:20

Код: Выделить всё

       -exec command {} +
              This  variant of the -exec action runs the specified command on the selected
              files, but the command line is built by appending each selected file name at
              the  end;  the  total number of invocations of the command will be much less
              than the number of matched files.  The command line is  built  in  much  the
              same  way that xargs builds its command lines.  Only one instance of `{}' is
              allowed within the command.  The command is executed in the starting  direc‐
              tory.

на сколько я понимаю, то на выполнение внешней команде в качестве аргумента отдается по одному найденному критерию (файлу, каталогу) в отличие от умолчального действия, когда все найденное find передает внешней команде. и если найденного очень много то получаем Too many arguments.
xargs делает ту же работу, полученные от find файлы он передает внешней команде по очереди.
только в случае с {} + не требуется "лишняя" команда xargs.
могу ошибаться, пусть кто-то поправит.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15835
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Поиск и архивирование множества файлов

Сообщение Bizdelnick » 30.07.2015 12:42

nerve писал(а):
30.07.2015 09:37
или так

Так не стоит. При большом количестве файлов упрётся в ограничение на длину командной строки (или на число аргументов — забыл уже, во что оно там упирается, но упирается).

toboe писал(а):
30.07.2015 11:08
Правда медленнее

(man xargs) писал(а):

Код: Выделить всё

       --max-procs=max-procs
       -P max-procs
              Run  up  to max-procs processes at a time; the default is 1.  If
              max-procs is 0, xargs will run as many processes as possible  at
              a  time.   Use the -n option with -P; otherwise chances are that
              only one exec will be done.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
s.xbatob
Сообщения: 807
ОС: Fedora

Re: Поиск и архивирование множества файлов

Сообщение s.xbatob » 30.07.2015 17:59

Bizdelnick писал(а):
30.07.2015 12:42
nerve писал(а):
30.07.2015 09:37
или так

Так не стоит. При большом количестве файлов упрётся в ограничение на длину командной строки (или на число аргументов — забыл уже, во что оно там упирается, но упирается).
Не переполнится. Там такое же ограничение, как и в xargs. Об этом сказано в info page
Спасибо сказали:

QWERTYASDF
Сообщения: 924
Статус: Чайник со свистком
ОС: GNU/Linux

Re: Поиск и архивирование множества файлов

Сообщение QWERTYASDF » 13.10.2015 00:16

У меня вопрос касательно конкретно утилиты find и опции ее -depth. Что-то долго не могла понять и не уверена что сейчас понимаю правильно.

Вот есть такое описание:

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


Тут мне однозначно не понять написанного. Как может find, запущенный пользователем, не имеющим прав чтения и исполнения (использования) некоего каталога, получить доступ к файлам в этом каталоге? Это ж вроде как противоречит концепции прав доступа в UNIX.

Далее есть такое описание:

Скажем я хочу провести резервное копирование моего домашнего каталога в смонтированный каталог /backup (имеется в виду копирование со всеми правами и т.п. – прим. переводчика). Я могу это сделать следующей командой:

find . -depth -print | cpio -dump /backup

Эта команда может выполняться и без ключа «-depth», но не всегда. По умолчанию find создает список найденных файлов начиная с места указанного в этой команде, в моем случае это «.» или мой домашний каталог. Этот список состоит из названия каталога, после которого идет содержимое этого каталога. Может возникнуть ситуация, когда исходный каталог имеет права только на чтение, и команда cpio, сначала создав каталог с такими правами, уже не сможет поместить туда файлы, которые содержатся в исходном каталоге (т.е. создается пустой каталог, только для чтения, в котором производится попытка создать файлы – прим. переводчика).

Однако, если вы вспомните о существовании ключа «-depth», то команда find будет формировать список найденных файлов начиная с нижних уровней вложенности. Это означает, что содержимое каталога будет в списке раньше чем его название. А это в свою очередь означает, что файлы, находящиеся в исходном каталоге, будут помещены cpio в целевой каталог раньше, чем она наложит на него права.


Здесь мне в принципе уже все понятно за исключением отсутствия упоминания необходимости x-бита для данного каталога.

Далее man find в моем дистрибутиве:

-depth Process each directory's contents before the directory itself. The -delete action also implies -depth


Т.е. "обработать все содержимое каталога перед самим каталогом". Ну в принципе понятно.

В интернетах есть разные такого-же рода непонятные описания действия этой опции. Складывается впечатление, что либо я чего-то не понимаю, либо авторы таких строк сами не понимают значение опции или что пишут...Как я поняла - опция задает обход каталогов не сверху-вниз от заданного в аргументе find, а снизу-вверх т.е. с файлов-НЕ каталогов каталога/каталогов самого глубокого уровня вложенности. Используется в т.ч. для решения проблемы скопировать каталог с сохранением прав всех его файлов, но для которого отсутствует w-бит, или когда при рекурсивной обработке нужно удалять обработанные файлы. Прошу меня поправить если не поняла таки сути и объяснить свойство и назначение сей загадочной опции ☺
Спасибо сказали:

Аватара пользователя
bormant
Сообщения: 1187

Re: Поиск и архивирование множества файлов

Сообщение bormant » 13.10.2015 08:09

Depth с английского -- глубина, глубь.
Управляет опция тем как строится список найденного, сверху вглубь или из глубины наверх (содержимое попадает в список до самого каталога):

$ find test
test
test/file
test/dir1
test/dir1/file
test/dir1/dir2
test/dir1/dir2/file

$ find -depth test
test/dir1/dir2/file
test/dir1/dir2
test/dir1/file
test/dir1
test/file
test

С точки зрения find на этом все. Обход из глубины появился по причине необходимости реализовать -delete и вынесен отдельным ключом. В каких других случаях он нужен применителю, тот сам сообразит (один из примеров с cpio уже был приведен), нужно просто прикинуть, в каком порядке нужно подать список найденного, в прямом или обратном.
Спасибо сказали:

Аватара пользователя
s.xbatob
Сообщения: 807
ОС: Fedora

Re: Поиск и архивирование множества файлов

Сообщение s.xbatob » 13.10.2015 09:43

Шикарная цитата! :) И в оригинале, в info page, это было объяснено неудачно. а при переводе остатки смысла вообще потерялись.

-- Option: -depth
Process each directory's contents before the directory itself. Doing this is a good idea when producing lists of files to archive with 'cpio' or 'tar'. If a directory does not have write permission for its owner, its contents can still be restored from the archive since the directory's permissions are restored after its contents.
Спасибо сказали:

QWERTYASDF
Сообщения: 924
Статус: Чайник со свистком
ОС: GNU/Linux

Re: Поиск и архивирование множества файлов

Сообщение QWERTYASDF » 13.10.2015 11:39

s.xbatob писал(а):
13.10.2015 09:43
И в оригинале, в info page, это было объяснено неудачно. а при переводе остатки смысла вообще потерялись.


Вот так вот и "полагайтесь на man/info - они ваше все"... Скорей уж на гугл ☺ Хотя чего я говорю, по крайней мере в данном случае в man было самое адекватное определение. Просто я к автору, чья цитата была первой, периодически возвращаюсь как к чему-то вроде настольной книги. Но там, к большому сожалению, все-таки слишком много ляпов ☹ Конкретно про find -depth никогда было не понятно из этой цитаты, вот вчера все-таки было принято решение поставить точку в этом вопросе.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15835
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Поиск и архивирование множества файлов

Сообщение Bizdelnick » 13.10.2015 12:26

QWERTYASDF писал(а):
13.10.2015 11:39
Вот так вот и "полагайтесь на man/info - они ваше все"...

Ну не переводные же!
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
Hephaestus
Сообщения: 2580
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Поиск и архивирование множества файлов

Сообщение Hephaestus » 13.10.2015 13:36

QWERTYASDF писал(а):
13.10.2015 11:39
Просто я к автору, чья цитата была первой, периодически возвращаюсь как к чему-то вроде настольной книги.
Сообщите нам имя этого коварного типа, который вводит людей в заблуждение столь изощрённым способом.
Дабы мы знали, от кого держаться подальше.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:

QWERTYASDF
Сообщения: 924
Статус: Чайник со свистком
ОС: GNU/Linux

Re: Поиск и архивирование множества файлов

Сообщение QWERTYASDF » 13.10.2015 14:14

Цитата отсюда. Уважаю автора, но все-таки не дело это, имхо.
Спасибо сказали:

Аватара пользователя
s.xbatob
Сообщения: 807
ОС: Fedora

Re: Поиск и архивирование множества файлов

Сообщение s.xbatob » 13.10.2015 14:57

QWERTYASDF писал(а):
13.10.2015 11:39
s.xbatob писал(а):
13.10.2015 09:43
И в оригинале, в info page, это было объяснено неудачно. а при переводе остатки смысла вообще потерялись.


Хотя чего я говорю, по крайней мере в данном случае в man было самое адекватное определение.
man page рекомендует прочесть info :)
Спасибо сказали:

QWERTYASDF
Сообщения: 924
Статус: Чайник со свистком
ОС: GNU/Linux

Re: Поиск и архивирование множества файлов

Сообщение QWERTYASDF » 13.10.2015 15:20

И что? Конкретно по данной опции там (в man) кратко, ясно и по делу написано.
Спасибо сказали:

QWERTYASDF
Сообщения: 924
Статус: Чайник со свистком
ОС: GNU/Linux

Re: Поиск и архивирование множества файлов

Сообщение QWERTYASDF » 21.10.2015 23:52

Поясните пожалуйста, чем в опции -perm команды find отличается "+" от "=" перед значением вида доступа? Т.е. чем, к примеру отличается

Код: Выделить всё

find . -perm -g+w,u+w


от

Код: Выделить всё

find . -perm -g=w,u=w

?
Спасибо сказали:

Аватара пользователя
yars
Сообщения: 1144
Статус: Slacker!
ОС: Slackware64-current

Re: Поиск и архивирование множества файлов

Сообщение yars » 22.10.2015 01:01

QWERTYASDF
For example -perm g=w will only match files which have mode 0020 (that is,
ones for which group write permission is the only permission set).

Например, -perm g=w означает только файлы, которые имеют режим 0020 (те, для которых только право записи для группы является единственным разрешением

...
-perm +mode
Deprecated, old way of searching for files with any of the permission bits in mode set. You should use -perm /mode instead. Trying to
use the `+' syntax with symbolic modes will yield surprising results. For example, `+u+x' is a valid symbolic mode (equivalent to +u,+x,
i.e. 0111) and will therefore not be evaluated as -perm +mode but instead as the exact mode specifier -perm mode and so it matches files
with exact permissions 0111 instead of files with any execute bit set.

Устаревшая форма поиска файлов с любым установленным битом разрешения. Вместо этого необходимо использовать `-perm /режим`. Попытки использовать синтаксис `+` совместно с символьным обозначением режима будут приводить к неожиданным результатам. Например, `+u+x` является верным символьным обозначением режима (эквивалентно `+u,+x`, т.е., 0111) и поэтому будет трактоваться не как `-perm +режим`, a как точный квалификатор `-perm режим` и означать файлы с точными правами 0111, вместо файлов с любым установленным битом выполнения

(q) man find
Как-то так, скиллы владения английским все-таки слабоваты :)
Slackware64-current/Xfce 4.12/Acer TravelMate 5760
-------------
Registered Linux User #557010
Спасибо сказали:

QWERTYASDF
Сообщения: 924
Статус: Чайник со свистком
ОС: GNU/Linux

Re: Поиск и архивирование множества файлов

Сообщение QWERTYASDF » 22.10.2015 02:54

yars

Я так понимаю, Вы мне показываете разницу между

Код: Выделить всё

-perm mode


Код: Выделить всё

-perm +mode


Код: Выделить всё

-perm /mode


А вопрос был про отличие

Код: Выделить всё

-perm -g+w,u+w


от

Код: Выделить всё

-perm -g=w,u=w


т.е. про синтаксис внутри mode.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15835
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Поиск и архивирование множества файлов

Сообщение Bizdelnick » 22.10.2015 14:19

Внутри mode, насколько я понимаю, разницы между ними нет.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

QWERTYASDF
Сообщения: 924
Статус: Чайник со свистком
ОС: GNU/Linux

Re: Поиск и архивирование множества файлов

Сообщение QWERTYASDF » 22.10.2015 14:46

А чем по вашему мнению все-таки обусловлена возможность ставить как "=" так и "+"?
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15835
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Поиск и архивирование множества файлов

Сообщение Bizdelnick » 22.10.2015 14:59

Тем, что такие варианты понимает chmod, и для него они как раз имеют разный смысл.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

QWERTYASDF
Сообщения: 924
Статус: Чайник со свистком
ОС: GNU/Linux

Re: Поиск и архивирование множества файлов

Сообщение QWERTYASDF » 22.10.2015 15:18

Bizdelnick писал(а):
22.10.2015 14:59
Тем, что такие варианты понимает chmod, и для него они как раз имеют разный смысл.


Слабо представляю связь между форматами указания изменений файловых прав для команды chmod и указания шаблона файловых прав для команды поиска find. На ум приходит пока лишь одно: часть командной строки, использованной для изменения прав файлов при помощи chmod - в дальнейшем по некой надобности используется в строке поиска файлов внутри выражения "-mode" или "/mode".
Спасибо сказали: