Вопрос

У меня есть 16 000 jpg-файлов из скриббера webcan, который я запустил в течение года, указывая на предыдущий год.Я хочу найти способ захватить каждое 4-е изображение, чтобы затем поместить их в другой каталог, чтобы позже превратить их в фильм.Есть ли простой скрипт bash или другой способ под linux, которым я могу это сделать?

Они названы вот так......

frame-44558.jpg

frame-44559.jpg

frame-44560.jpg

frame-44561.jpg

Спасибо от новичка, нуждающегося в помощи.


Кажется, это сработало.Пара ошибок в моем оригинальном посте.На самом деле там было 280 000 изображений, и название было таким./home/baldy/Desktop/webcamimages/webcam_2007-05-29_163405.jpg /home/baldy/Desktop/webcamimages/webcam_2007-05-29_163505.jpg /home/baldy/Desktop/webcamimages/webcam_2007-05-29_163605.jpg

Я побежал.cp $(ls | awk '{nr++;if (nr % 10 == 0) вывести $0}') ../newdirectory/

Который, похоже, скопировал изображения.судя по всему, 70-900 в день.

Теперь я убегаю. mencoder mf: //*.jpg -mf w= 640: h= 480: fps= 30: тип=jpg -ovc lavc -lavcopts vcodec=msmpeg4v2 -nosound -o ../вывод-msmpeg4v2.avi

Я дам вам знать, как получится из фильма.

Обновить:Фильм не удался.В нем есть только изображения 2007 года, хотя в каталоге также есть 2008 год.webcam_2008-02-17_101403.jpg webcam_2008-03-27_192205.jpg webcam_2008-02-17_102403.jpg webcam_2008-03-27_193205.jpg webcam_2008-02-17_103403.jpg webcam_2008-03-27_194205.jpg webcam_2008-02-17_104403.jpg webcam_2008-03-27_195205.jpg

Как я могу изменить строку моего mencoder, чтобы она использовала все изображения?

Это было полезно?

Решение

Одним из простых способов является:

$ touch a b c d e f g h i j k l m n o p q r s t u v w x y z
$ mv $(ls | awk '{nr++; if (nr % 4 == 0) print $0}') destdir

Другие советы

Создайте скрипт move.sh, который содержит это:

#!/bin/sh
mv $4 ../newdirectory/

Сделайте его исполняемым, а затем сделайте это в папке:

ls *.jpg | xargs -n 4 ./move.sh

Это берет список имен файлов, передает по четыре за раз в move.sh, который затем игнорирует первые три и перемещает четвертое в новую папку.

Это будет работать, даже если числа расположены не совсем последовательно (например,если некоторые номера кадров отсутствуют, то использование арифметики mod 4 работать не будет).

Как было предложено, вы должны использовать

seq -f 'frame-%g.jpg' 1 4 number-of-frames

сгенерировать список имен файлов, поскольку 'ls' завершится ошибкой для файлов 280k.Таким образом, окончательное решение было бы чем-то вроде:

for f in `seq -f 'frame-%g.jpg' 1 4 number-of-frames` ; do
  mv $f destdir/
done
seq -f 'frame-%g.jpg' 1 4 number-of-frames

... выведет названия нужных вам файлов.

Простой способ в perl (вероятно, легко адаптируемый к bash) - объединить имена файлов в массив, затем получить порядковый номер и удалить те, которые не делятся на 4

Что-то вроде этого распечатает нужные вам файлы:

ls -1 /path/to/files/ | perl -e 'while (<STDIN>) {($seq)=/(\d*)\.jpg$/; print $_ if $seq && $seq % 4 ==0}'

Вы можете заменить печать перемещением...

Это сработает, если файлы пронумерованы последовательно, даже если количество цифр не является постоянным, например file_9.jpg за которым следует file_10.jpg )

Учитывая предостережения масто по поводу сортировки:

ls | sed -n '1~4 p' | xargs -i mv {} ../destdir/

Что мне нравится в этом решении, так это то, что все делает то, для чего оно было разработано, так что мне оно кажется уникальным.

Просто выполните итерацию по списку файлов:

files=( frame-*.jpg )
i=0
while [[ $i -lt ${#files} ]] ; do
  cur_file=${files[$i]}
  mungle_frame $cur_file
  i=$( expr $i + 4 )
done

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

mkdir ../outdir
ls | sort -n | while read fname; do mv "$fname" ../outdir/; read; read; read; done

Тот Самый sort -n предполагается ли, что не все ваши имена файлов содержат одинаковое количество цифр;в противном случае ls будет отсортирован в лексическом порядке, где frame-123.jpg приходит раньше frame-4.jpg и я не думаю, что это то, чего ты хочешь.

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

Обратите внимание, что это решение обрабатывает файлы с пробелами в имени, в отличие от большинства других.Я знаю, что это не было частью примеров имен файлов, но легко написать команды оболочки, которые небезопасно обрабатывают пробелы, поэтому я хотел сделать это в этом примере.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top