Хватая каждый 4-й файл - PullRequest
       12

Хватая каждый 4-й файл

3 голосов
/ 16 сентября 2008

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

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

каркасно-44558.jpg

рамка-44559.jpg

рамка-44560.jpg

каркасно-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) print $ 0}') ../newdirectory/

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

Теперь я бегу mencoder mf: //*.jpg -mf w = 640: h = 480: fps = 30: type = jpg -ovc lavc -lavcopts vcodec = msmpeg4v2 -nosound -o ../output-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 так, чтобы она использовала все изображения?

Ответы [ 8 ]

12 голосов
/ 16 сентября 2008

Один простой способ:

$ 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

2 голосов
/ 16 сентября 2008

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

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
2 голосов
/ 16 сентября 2008

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

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

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

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

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

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

1 голос
/ 16 сентября 2008

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

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

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

1 голос
/ 16 сентября 2008
seq -f 'frame-%g.jpg' 1 4 number-of-frames

… напечатает имена нужных вам файлов.

1 голос
/ 16 сентября 2008

Простой способ в 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)

0 голосов
/ 16 сентября 2008

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

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, и я не думаю, что это то, что вы хотите.

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

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

0 голосов
/ 16 сентября 2008

Просто переберите список файлов:

files=( frame-*.jpg )
i=0
while [[ $i -lt ${#files} ]] ; do
  cur_file=${files[$i]}
  mungle_frame $cur_file
  i=$( expr $i + 4 )
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...