2008-09-16 2 views
3

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

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

каркасно-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 /дома/Лысый/Desktop/webcamimages/webcam_2007-05-29_163605. jpg

Я бежал. cp $ (ls | awk '{nr ++; if (nr% 10 == 0) print $ 0}') ../newdirectory/

Возможно, вы копировали изображения. 70-900 в день от внешнего вида.

Теперь я бегу с помощью MEncoder СЧ: //*.jpg -mf ш = 640: ч = 480: 30 кадров в секунду = Тип = 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 так, чтобы она использовала все изображения?

ответ

11

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

 
$ 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 

+6

Может быть, вы должны указать, что первая строка не нужна, он просто создает образец данных ... – Sklivvz 2008-09-16 12:47:40

1

простой способ в Perl (возможно, легко адаптируются к колотить) является шарик имена файлов в массиве затем получить порядковый номер и удалить те, которые не делятся на 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)

2

Создать ход сценария.ш, который содержит следующее:

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

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

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

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

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

+0

Ls * .jpg | xargs -n 10 ./copy.sh bash:/bin/ls: слишком длинный список аргументов cp: can not stat `0 ': Нет такого файла или каталога – user11950 2008-09-16 14:27:49

+0

Я допустил ошибку. Было 280 000 изображений :) – user11950 2008-09-16 14:31:35

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

... напечатает имена необходимых вам файлов.

0

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

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

Это довольно дрянной, но он должен получить работу. Предполагая, что вы в настоящее время 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 и не думаю, что это необходимо.

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

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

1

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

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

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

2

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

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 
Смежные вопросы