Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: как слить все avi файлы в папке в один  (Прочитано 3282 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн spk-ubuntu

  • Активист
  • *
  • Сообщений: 502
    • Просмотр профиля
Re: как слить все avi файлы в папке в один
« Ответ #15 : 04 Августа 2011, 00:01:15 »
все оказалось просто.
а если бы понадобилось отсортировать в обратном порядке? ;) я периодически размышляю над исходной задачкой "силами баша получить строку, состоящую из имен файлов указанного каталога, разделённых пробелами". Пока безуспешно (проверил варианты, которые писал в этой теме - фуфло полнейшее). Если кто знает решение - подскажите.

andrey_p

  • Гость
Re: как слить все avi файлы в папке в один
« Ответ #16 : 04 Августа 2011, 06:02:31 »
Чем не понравилась манера изложения совета? Это мне на будущее, чтоб знать, как правильно советовать.
Цитировать
Оболочка сортирует "*" по имени автоматически. Так что
Код:
avimerge -i /media/TMP/Fraps/h264/*.avi  -o out.avi
должно замечательно работать (за исключением случаев, когда файлов реально много - аргументы не уместяться, но тогда можно перейти в директорий и запустить оттуда или попробовать xargs).

@spk-ubuntu Боюсь даже сказать что-то. А то вдруг опять не то ляпну. Впрочем попробую:
ls | while read f; do
  echo Do something with "$f" # получаете свою строку
done
Это работает за исключением совсем клинических случаев - когда в пробелы в начале имени файла или переводы строки в имени (с ними тоже можно работать, но сложнеее) . Вместо ls естественно любая другая команда или фильтр - вроде 'find...| sort --options' и т.п.
« Последнее редактирование: 04 Августа 2011, 06:05:19 от andrey_p »

Оффлайн spk-ubuntu

  • Активист
  • *
  • Сообщений: 502
    • Просмотр профиля
Re: как слить все avi файлы в папке в один
« Ответ #17 : 04 Августа 2011, 07:40:32 »
ls | while read f; do
  echo Do something with "$f" # получаете свою строку
done
очень интересный вариант использования read-а. спасибо!

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: как слить все avi файлы в папке в один
« Ответ #18 : 04 Августа 2011, 08:24:33 »
если бы понадобилось отсортировать в обратном порядке?
... | sort -r
Для иллюстрации типовой пример.
Пусть делается видео ремонта.
Там есть прямое видео снятия неисправной детали, сделанной в инвенторе или снятое в натуре
и надо сделать еще реверсивное видео установки запчасти.
Сделать реверсивное видео можно так.

#! /bin/sh
# Сделаем реверсивный avi из выбранного

# - сделать покадровые изображения
ffmpeg -i $1 image%5d.png

# - поменять порядок названий файлов изображений на обратный
find . -name "*.png" -exec basename {} \; | sort > /tmp/1.tmp
cat /tmp/1.tmp | sort -r >/tmp/2.tmp
find . -name "*.png" -exec mv {} {}.old \;
exec 7</tmp/2.tmp
while read a
do
read b <& 7
mv $b.old $a
done </tmp/1.tmp

# - создать из новых изображений revers.avi
ffmpeg -r 15 -b 900k -f image2 -i image%5d.png revers.avi
#зачистим
rm *.png

ЗЫ.Код можно оптимизировать.
« Последнее редактирование: 04 Августа 2011, 08:33:41 от alexander.pronin »

andrey_p

  • Гость
Re: как слить все avi файлы в папке в один
« Ответ #19 : 04 Августа 2011, 09:14:46 »
Для указанного случая это могло бы выглядеть так:
find DIR -name '*.EXT' -print0 | sort --version-sort -r | xargs -0 CMD -o OUTPUTFILEЕсли нужно воткнуть строки c пробелами "внутрь" аргументов команды, то
args=""; cat SOMEFILE | while read line; do
  args="$args '$line'"
done;
eval CMD "$args" SOME_OTHER_ARGS
Есть и другие возможности, но на самом деле лучше действительно сначала переименовать файлы, убрав пробелы, и тогда (и только тогда) можно было бы использовать ls со всей мощью ее бесконечного количества опций да и множество других команд, не боясь за разбивку аргументов на части по пробелам.
« Последнее редактирование: 04 Августа 2011, 09:17:47 от andrey_p »

Оффлайн spk-ubuntu

  • Активист
  • *
  • Сообщений: 502
    • Просмотр профиля
Re: как слить все avi файлы в папке в один
« Ответ #20 : 08 Августа 2011, 21:46:31 »
#18: временные файлы мы использовать не договаривались. берём чистый вывод от "ls | sort [-r] |" и получаем строку вида "имя файла1" "имя файла2" ... "имя файлаN"
но всё равно спасибо - весьма интересный код для изучения ))
#19: повторяетесь ;)

у меня есть идея попробовать это сделать sed-ом, только никак не найду времени чтобы отрыть путёвый мануал. я знаю что в sed-е есть возможность отредактировать текст во внутреннем буфере и выплюнуть готовую строку. осталось лишь найти нужные команды ))))

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: как слить все avi файлы в папке в один
« Ответ #21 : 09 Августа 2011, 10:42:17 »
#18: временные файлы мы использовать не договаривались.
Без временных файлов можно обойтись только при наличии трубы.
Если трубы нет, то надо где-то промежуточные файлы сохранять.

 

Страница сгенерирована за 0.017 секунд. Запросов: 22.