пакетная обработка файлов в bash (find, xargs, etc..)

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

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

Аватара пользователя
Doka
Сообщения: 715
Статус: ASIC Design Engineer
ОС: RHEL4

пакетная обработка файлов в bash

Сообщение Doka »

задача 1:
ужать битрейт в пакетном режиме с помощью lame. Для этого ищу все файлы *.mp3 в текущей директории и передаю lame. Но lame может воспринимать только имена файлов без пути. Т.е. вместо ./1_35.mp3 ему надо 1_35.mp3, а find возвращает именно с ./
пробовал дополнительно прогнать через basename - результат не очень:

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

$ find -iname '*.mp3' -print0 | xargs -0 basename | lame --preset voice -h
LAME 32bits version 3.97 (http://www.mp3dev.org/)
usage: lame [options] <infile> [outfile]

basename: extra operand `./1_35.mp3'
Try `basename --help' for more information.


задача 2:
схожая.
необходимо каждый файл с расширением *.fb2 (в папках и подпапках) заархивировать в *.fb2.tar.bz2. На каждый файл - отдельный архив. проблема в том, что tar'у надо передавать два аргумента: имя вх. файла и имя вых.файла. Пробовал сделать это, указывая после xargs параметр $1:

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

find -iname '*.fb2' -print | xargs  tar cjv $1.tar.bz2 $1
результат: архивированный поток выводится в stdout.
Never stop thinking..................................................................
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: пакетная обработка файлов в bash

Сообщение v04bvs »

1.
find printf "%f\ноль"
ноль заменить на 0. форум глючит.

2.
find -exec tar cjf {}.tar.bz2 {} \;
Спасибо сказали:
Аватара пользователя
Doka
Сообщения: 715
Статус: ASIC Design Engineer
ОС: RHEL4

Re: пакетная обработка файлов в bash

Сообщение Doka »

v04bvs
с архивириванием разобрался. спасибо.

а вот с первым пунктом непонятно. можно подробнее?
Never stop thinking..................................................................
Спасибо сказали:
Аватара пользователя
Doka
Сообщения: 715
Статус: ASIC Design Engineer
ОС: RHEL4

Re: пакетная обработка файлов в bash

Сообщение Doka »

v04bvs
find -printf "%f\ноль" тоже работает, но не так, как хотелось бы:

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

find -iname '*.mp3' -printf "%f\ноль" | xargs lame --preset voice -h

происходит кодирование только одного (первого в списке) файла. после чего скрипт оканчивает работу.


пробовал играться с параметрами, но в противоположном случае ничего кроме :

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

find -iname '*.mp3' -printf "%f" | xargs lame --preset voice -h
Could not find "1_40.mp31_20.mp31_35.mp31_48.mp31_46.mp31_49.mp32_10.mp32_03.mp3".
не смог добиться
Never stop thinking..................................................................
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: пакетная обработка файлов в bash

Сообщение v04bvs »

А так:

find -iname '*.mp3' -printf "%f\ноль" | xargs -0 -n1 lame --preset voice -h
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: пакетная обработка файлов в bash

Сообщение Portnov »

v04bvs, у find есть опция -print0
;)
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Аватара пользователя
Doka
Сообщения: 715
Статус: ASIC Design Engineer
ОС: RHEL4

Re: пакетная обработка файлов в bash

Сообщение Doka »

v04bvs писал(а):
06.03.2008 18:47
А так:

find -iname '*.mp3' -printf "%f\ноль" | xargs -0 -n1 lame --preset voice -h

да. спасибо. так работает.

как можно оттюнинговать сей скрипт ,чтобы корректировать названия вых. файлов
формат lame: lame опции вх_файл вых_файл

по умолчанию формат (когда вых.файл не указывается) не очень удачный: 1_40.mp3.mp3
как можно воздействовать на второй агрумент - производную от имени первого аргумента (по аналогии с bzip2 {}.tar.bz2 {} )
Never stop thinking..................................................................
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: пакетная обработка файлов в bash

Сообщение v04bvs »

Portnov писал(а):
06.03.2008 21:32
v04bvs, у find есть опция -print0
;)


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

   vsb-laptop% find -print0 | xargs -0 -n1 echo                  /home/vsb/tmp/sql
 .
 ./file
 ./script.sql
 ./columns
 vsb-laptop% find -printf "%f\ноль" | xargs -0 -n1 echo           /home/vsb/tmp/sql
 .
 file
 script.sql
 columns

Найдите 10 отличий :-)

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

Можно с sed-ом поизвращаться, я обычно перехожу в таких случаях на perl.
Спасибо сказали:
Аватара пользователя
Doka
Сообщения: 715
Статус: ASIC Design Engineer
ОС: RHEL4

Re: пакетная обработка файлов в bash

Сообщение Doka »

v04bvs писал(а):
07.03.2008 07:56
Можно с sed-ом поизвращаться, я обычно перехожу в таких случаях на perl.

попробую поизвращаться на TCL, как на единственно знаемых из скриптовых))
Never stop thinking..................................................................
Спасибо сказали:
Аватара пользователя
budda
Сообщения: 24
ОС: Ubuntu 9.10

Re: пакетная обработка файлов в bash

Сообщение budda »

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

Re: пакетная обработка файлов в bash

Сообщение drBatty »

v04bvs писал(а):
06.03.2008 18:47
find -iname '*.mp3' -printf "%f\ноль" | xargs -0 -n1 lame --preset voice -h

а так можно файлы потерять (из-за ограничения на длину строки)
лучше так:

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

/bin/ls *.mp3 | sed -r 's%.*%lame -h "&" "/home/drb/conv/&"%e'
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

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

Re: пакетная обработка файлов в bash

Сообщение drBatty »

budda писал(а):
11.09.2009 19:35
Здесь расписано как кодировать

ИМХО в данном случае опасно использовать for in *,имена файлов часто содержат пробелы и проч.
к тому-же опять-таки можно потерять файлы из-за длинны строки.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: