سؤال

لدي 16,000 jpg من webcan screeb المختطف التي سمحت تشغيل لمدة عام مشيرا إلى الخلف العام.كنت تريد أن تجد وسيلة لانتزاع كل 4 صورة حتى أستطيع أن ثم وضعها في دليل آخر حتى أستطيع في وقت لاحق تحويلها إلى فيلم.هل هناك بسيطة باش النصي أو طريقة أخرى تحت لينكس التي يمكن أن أفعل هذا.

وهم اسمه مثل ذلك......

frame-44558.jpg

frame-44559.jpg

frame-44560.jpg

frame-44561.jpg

شكرا من newb الذين يحتاجون إلى مساعدة.


يبدو أن عملت.بعض الأخطاء في origonal بعد.كانت هناك فعلا من 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

ركضت.م أ $(ls | awk '{nr++;إذا (nr % 10 == 0) print $0}') ../newdirectory/

التي يبدو أن لديها نسخ الصور.70-900 في يوم من يتطلع إليها.

الآن أنا على التوالي مينكودر mf://*.jpg -mf w=640:h=480:fps=30:نوع=jpg -الأيتام والأطفال الضعفاء 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

كيف يمكنني تعديل بلدي مينكودر الخط بحيث يستخدم كل الصور ؟

هل كانت مفيدة؟

المحلول

واحد طريقة بسيطة هي:

$ 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 ثم يتجاهل الثلاثة الأولى ويتحرك الرابع إلى مجلد جديد.

هذا العمل حتى لو كانت الأرقام ليست بالضبط في تسلسل (مثلا ، إذا كان بعض الأرقام الإطار مفقودة ، ثم باستخدام وزارة الدفاع 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

...طباعة أسماء الملفات التي تحتاج إليها.

طريقة سهلة في بيرل (ربما قابلة للتكيف بسهولة إلى باش) هو غلوب أسماء الملفات في مصفوفة ثم الحصول على رقم التسلسل و إزالة تلك التي لا يقبل القسمة على 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/

الشيء الذي يعجبني في هذا الحل هو أن كل شيء يفعل ما كانت تهدف إلى القيام به ، لذلك يشعر unixy لي.

مجرد تكرار عبر قائمة من الملفات:

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

هذا هو جبني جدا, ولكن يجب أن تحصل على هذه المهمة.على افتراض أنك حاليا cd سيكون في الدليل الذي يحتوي جميع الملفات الخاصة بك:

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