Вопрос
У меня есть 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
и я не думаю, что это то, чего ты хочешь.
Пожалуйста, будьте осторожны, создайте резервные копии своих файлов, прежде чем пробовать мое решение и т.д.Я не хочу нести ответственность за то, что вы потеряете данные за год.
Обратите внимание, что это решение обрабатывает файлы с пробелами в имени, в отличие от большинства других.Я знаю, что это не было частью примеров имен файлов, но легко написать команды оболочки, которые небезопасно обрабатывают пробелы, поэтому я хотел сделать это в этом примере.