Добавление файлов в архив по размеру

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

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
radial
Сообщения: 577
ОС: OpenSUSE

Добавление файлов в архив по размеру

Сообщение radial »

Право, стыдно, хотел уж в "вопросы новичка"..

Меня интересует изящное решение такого вопроса:
как добавить конфиги из /home в бекап?
Имеются в виду скрытые файлы, которые конфиги - т.е. текстовые файлы небольшого размера. Как добавить просто скрытые файлы я знаю, но как в это красиво включить проверку "не больше n Кб"?

Готов внимать и учиться :) а то у мну все какие-то циклы на уме (да-да, +незнание манов)
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Добавление файлов в архив по размеру

Сообщение watashiwa_daredeska »

("man find") писал(а):Numeric arguments can be specified as
+n for greater than n,
-n for less than n,
n for exactly n.

-size n[cwbkMG]
File uses n units of space. The following suffixes can be used:
`b' for 512-byte blocks (this is the default if no suffix is used)
`c' for bytes
`w' for two-byte words
`k' for Kilobytes (units of 1024 bytes)
`M' for Megabytes (units of 1048576 bytes)
`G' for Gigabytes (units of 1073741824 bytes)
The size does not count indirect blocks, but it does count blocks in sparse files that are not actually allocated. Bear in mind that the
`%k' and `%b' format specifiers of -printf handle sparse files differently. The `b' suffix always denotes 512-byte blocks and never 1 Kilo‐
byte blocks, which is different to the behaviour of -ls.
Спасибо сказали:
Аватара пользователя
radial
Сообщения: 577
ОС: OpenSUSE

Re: Добавление файлов в архив по размеру

Сообщение radial »

блин.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Добавление файлов в архив по размеру

Сообщение drBatty »

а вот так

$

$ find -exec file {} \; | grep -E " shell script text executable$"


можно проверить тип всех файлов, а затем отфильтровать из них только исполняемые shell скрипты

(будьте внимательны - тексты бывают разные, и команда file не всегда правильно определяет их тип)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Добавление файлов в архив по размеру

Сообщение ZyX »

drBatty писал(а):
23.10.2010 21:59
а вот так

$

$ find -exec file {} \; | grep -E " shell script text executable$"


можно проверить тип всех файлов, а затем отфильтровать из них только исполняемые shell скрипты

(будьте внимательны - тексты бывают разные, и команда file не всегда правильно определяет их тип)

Гораздо лучше это делать через MIME: заменить file на file --mime-type и проверять на соответствие text/x-shellscript$ (скрипт под zsh у меня определяется как Paul Falstad's zsh script text executable, но имеет тот же mime). Кроме того, я не уверен, что file не может быть локализованной. Кстати, вариант для zsh, работающий в том числе и с файлами с «\n» внутри имени:

~/tmp/zsh/test-findex.zsh (Created by format.vim)

emulate -LR zsh function testSh() { [[ "$(file --brief --mime-type $REPLY)" == "text/x-shellscript" ]] } for script in **/*(+testSh) ; do echo $script done


Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Добавление файлов в архив по размеру

Сообщение drBatty »

ZyX писал(а):
24.10.2010 19:23
Гораздо лучше это делать через MIME

легко!

$

find . -exec file --mime-type {} \; | grep -E "text/x-shellscript"



PS: серое на чёрном я еле-еле вижу в серебристой схеме :(

PPS: кстати, вопрос был "меньше n и текстовые". Ваш скрипт в данных условиях будет работать ооооочень долго. В мой-же достаточно ввести всего одно условие: -size -n.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Добавление файлов в архив по размеру

Сообщение ZyX »

drBatty писал(а):
24.10.2010 23:07
ZyX писал(а):
24.10.2010 19:23
Гораздо лучше это делать через MIME

легко!

$

find . -exec file --mime-type {} \; | grep -E "text/x-shellscript"



Вы забыли про вторую разницу: поддержка имён с нестандартными символами вроде LF.
drBatty писал(а):
24.10.2010 23:07
PS: серое на чёрном я еле-еле вижу в серебристой схеме :(

Там нет серого: просто format.vim явно указывает все цвета, в том числе белый.
drBatty писал(а):
24.10.2010 23:07
PPS: кстати, вопрос был "меньше n и текстовые". Ваш скрипт в данных условиях будет работать ооооочень долго. В мой-же достаточно ввести всего одно условие: -size -n.

Искать файлы он будет не дольше, чем find (может, даже немного быстрее). Проблема заключается в том, что zsh сначала найдёт все файлы, а потом позволит что-то с ними сделать, а с find можно параллельно искать и что-то делать с результатом. Кроме того непонятно, почему вы противопоставляете «долгую работу» и лёгкость введения условия, никак с этой работой не связанного. Кроме того, в zsh можно использовать флаг L-n, поставив его прямо перед +Function. Не думаю, что это сложнее.
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -

Re: Добавление файлов в архив по размеру

Сообщение sgfault »

ZyX писал(а):
26.10.2010 20:05
Искать файлы он будет не дольше, чем find (может, даже немного быстрее).

Я не знаю zsh, но насколько я понимаю, файлы перебирает сам shell? И вы считаете, что цикл в shell-e будет работать быстрее бинарника? Хотелось бы увидеть доказательства.

UPD.
ZyX писал(а):
26.10.2010 20:05
Вы забыли про вторую разницу: поддержка имён с нестандартными символами вроде LF.


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

( LANG=C; find -exec file -0 --mime-type {} \; | sed -ne': cycle; /\x0/! { N; b cycle; }; /\x0 text\/x-shellscript$/s/\x0.*//p;'  )

а теперь? -)
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Добавление файлов в архив по размеру

Сообщение drBatty »

ZyX писал(а):
26.10.2010 20:05
Вы забыли про вторую разницу: поддержка имён с нестандартными символами вроде LF.

ну тогда '{}' это будет работать с чем угодно, кроме '
ZyX писал(а):
26.10.2010 20:05
Там нет серого: просто format.vim явно указывает все цвета, в том числе белый.

о том и речь.
ZyX писал(а):
26.10.2010 20:05
Искать файлы он будет не дольше, чем find (может, даже немного быстрее). Проблема заключается в том, что zsh сначала найдёт все файлы, а потом позволит что-то с ними сделать, а с find можно параллельно искать и что-то делать с результатом.

"что-то сделать" это например наложить следующее условие. насколько я понял лгику работы find...
ну например: у вас есть 10000000 файлов. find . -X найдёт 1000 файлов, а в find . -X -Y условие -Y обработает всего 1000 файлов. Т.е. на вход второго условия попадают только файлы прошедшие первое.
ZyX писал(а):
26.10.2010 20:05
Кроме того, в zsh можно использовать флаг L-n, поставив его прямо перед +Function. Не думаю, что это сложнее.

ну если +Function получит ТОЛЬКО мелкие файлы, то всё нормально.
sgfault писал(а):
27.10.2010 11:03
Я не знаю zsh, но насколько я понимаю, файлы перебирает сам shell? И вы считаете, что цикл в shell-e будет работать быстрее бинарника? Хотелось бы увидеть доказательства.

могу доказать противоположное заключение ;)
мало того, find работает быстрее программы на C, которая рекурсивно перебирает все файлы - find обращается к структурам данных ФС напрямую, т.е. программа на С будет работать как-бы ЧЕРЕЗ find (впрочем, разница наверное невилика для С).
sgfault писал(а):
27.10.2010 11:03
а теперь? -)

file -0 Хорошая Мысль :)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -

Re: Добавление файлов в архив по размеру

Сообщение sgfault »

drBatty писал(а):
27.10.2010 16:46
ZyX писал(а):
26.10.2010 20:05
Вы забыли про вторую разницу: поддержка имён с нестандартными символами вроде LF.

ну тогда '{}' это будет работать с чем угодно, кроме '

Либо я чего-то не знаю.. Не понимаю, зачем {} вообще брать в кавычки, экранировать и прочее? Ведь то, что туда подставит find, какие бы там символы не содержались, так и останется одним аргументом для программы. А для баша {} не является специальным символом. Или, другими словами, команда, написанная в моем предыдущем посте в таком виде как есть, по крайней мере у меня правильно обрабатывает и \n, и пробелы, и кавычки в именах файлов.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Добавление файлов в архив по размеру

Сообщение drBatty »

sgfault писал(а):
27.10.2010 17:06
Не понимаю, зачем {} вообще брать в кавычки

действительно.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Добавление файлов в архив по размеру

Сообщение ZyX »

drBatty писал(а):
27.10.2010 16:46
ZyX писал(а):
26.10.2010 20:05
Вы забыли про вторую разницу: поддержка имён с нестандартными символами вроде LF.

ну тогда '{}' это будет работать с чем угодно, кроме '

Он и с «'» работает. Только сделайте фильтр, использующий команду для фильтрации вроде того с --mime-type.
drBatty писал(а):
27.10.2010 16:46
ZyX писал(а):
26.10.2010 20:05
Искать файлы он будет не дольше, чем find (может, даже немного быстрее). Проблема заключается в том, что zsh сначала найдёт все файлы, а потом позволит что-то с ними сделать, а с find можно параллельно искать и что-то делать с результатом.

"что-то сделать" это например наложить следующее условие. насколько я понял лгику работы find...

Имеется ввиду, что zsh сначала получит весь список, а только потом будет по нему итерировать. Тут нет генераторов, как в Python.
drBatty писал(а):
27.10.2010 16:46
ну например: у вас есть 10000000 файлов. find . -X найдёт 1000 файлов, а в find . -X -Y условие -Y обработает всего 1000 файлов. Т.е. на вход второго условия попадают только файлы прошедшие первое.
ZyX писал(а):
26.10.2010 20:05
Кроме того, в zsh можно использовать флаг L-n, поставив его прямо перед +Function. Не думаю, что это сложнее.

ну если +Function получит ТОЛЬКО мелкие файлы, то всё нормально.

Это легко проверить:

Код:

function Test() { echo "$REPLY" } true **/*(/+Test)

Выводит только каталоги.
drBatty писал(а):
27.10.2010 16:46
sgfault писал(а):
27.10.2010 11:03
Я не знаю zsh, но насколько я понимаю, файлы перебирает сам shell? И вы считаете, что цикл в shell-e будет работать быстрее бинарника? Хотелось бы увидеть доказательства.

могу доказать противоположное заключение ;)
мало того, find работает быстрее программы на C, которая рекурсивно перебирает все файлы - find обращается к структурам данных ФС напрямую, т.е. программа на С будет работать как-бы ЧЕРЕЗ find (впрочем, разница наверное невилика для С).
sgfault писал(а):
27.10.2010 11:03
а теперь? -)

file -0 Хорошая Мысль :)

Тут не цикл на shell, у zsh, насколько я знаю, своя функция glob. Тут я ошибся: я думал, она гораздо лучше оптимизирована. Впрочем, при составлении сложных условий у zsh по-прежнему преимущество: их легче написать.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Добавление файлов в архив по размеру

Сообщение drBatty »

ZyX писал(а):
28.10.2010 22:20
их легче написать.

это субъективно. А в целом - согласен.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -

Re: Добавление файлов в архив по размеру

Сообщение sgfault »

ZyX писал(а):
28.10.2010 22:20
drBatty писал(а):
27.10.2010 16:46
ZyX писал(а):
26.10.2010 20:05
Вы забыли про вторую разницу: поддержка имён с нестандартными символами вроде LF.

ну тогда '{}' это будет работать с чем угодно, кроме '

Он и с «'» работает.

Команда с find ровно, как и ваш скрипт, с _любым_ экранированием будет работать с _любыми_ символами в именах. Все 4-и команды

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

find -exec file {} \;

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

find -exec file '{}' \;

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

find -exec file \{\} \;

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

find -exec file "{}" \;


будут работать абсолютно одинаково для _любых_ имен файлов. Это происходит потому, что кавычки снимает shell, а имена файлов при вызове команды после '-exec' подставляет сам find (он же ее и вызывает, без помощи shell-a).
Вот пример вывода

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

.: directory
./1.tmp: ASCII text
./cmd: ASCII text
./X\"'bn: empty
./c
d
r
    h: Bourne-Again shell script text executable
./f
g.txt: Bourne-Again shell script text executable
./c    d.txt: python script text executable
./1'2"3: Bourne-Again shell script text executable
./Y\Z: empty
./a
b.txt: Bourne-Again shell script text executable
./z
 x
   y
    w  : Bourne-Again shell script text executable
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Добавление файлов в архив по размеру

Сообщение ZyX »

sgfault писал(а):
29.10.2010 10:41
ZyX писал(а):
28.10.2010 22:20
drBatty писал(а):
27.10.2010 16:46
ZyX писал(а):
26.10.2010 20:05
Вы забыли про вторую разницу: поддержка имён с нестандартными символами вроде LF.

ну тогда '{}' это будет работать с чем угодно, кроме '

Он и с «'» работает.

Команда с find ровно, как и ваш скрипт, с _любым_ экранированием будет работать с _любыми_ символами в именах. Все 4-и команды

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

find -exec file {} \;

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

find -exec file '{}' \;

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

find -exec file \{\} \;

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

find -exec file "{}" \;


будут работать абсолютно одинаково для _любых_ имен файлов. Это происходит потому, что кавычки снимает shell, а имена файлов при вызове команды после '-exec' подставляет сам find (он же ее и вызывает, без помощи shell-a).
Вот пример вывода

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

.: directory
./1.tmp: ASCII text
./cmd: ASCII text
./X\"'bn: empty
./c
d
r
    h: Bourne-Again shell script text executable
./f
g.txt: Bourne-Again shell script text executable
./c    d.txt: python script text executable
./1'2"3: Bourne-Again shell script text executable
./Y\Z: empty
./a
b.txt: Bourne-Again shell script text executable
./z
 x
   y
    w  : Bourne-Again shell script text executable


Я об этом знаю (кстати, использование ’{}’ вместо {} могут рекомендовать, чтобы пользователь не забыл экранирование когда между скобками окажется запятая). Замечание о неподдержке нестандартных символов относилось к способу с find … | xargs file. В man file на это есть замечательный ключ «-0»: тогда строка будет выглядеть так: «<filename>\0<spaces><mime-type>\n», и добыть имя файла можно пропустив через ещё один конвейер: | perl -p -i -e 's/\0[^\n]\n/\0/g'.
Спасибо сказали: