3

私は 16,000 の jpg を webcan screeb グラバーから 1 年間実行させて、過去の年を指しています。後でそれらをムービーに変換できるように、4 枚ごとに画像を取得して別のディレクトリに配置できるようにする方法を見つけたいと考えています。Linuxでこれを実行できる簡単なbashスクリプトまたはその他の方法はありますか。

彼らはそのように名付けられています......

フレーム-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/

画像をコピーしたようです。見た目からして1日70~900本。

今、私は mencoder mf://*.jpg -mf w=640:h=480:fps=30:type=jpg -ovc lavc -lavcopts vcodec=msmpeg4v2 -nosound -o ../output-msmpeg4v2.avi を実行しています

映画の出来上がりをご紹介します。

更新: ムービーが機能しませんでした。ディレクトリには2008年もありますが、2007年の画像しかありません。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 行を変更するにはどうすればよいですか?

4

8 に答える 8

13

1 つの簡単な方法は次のとおりです。

$ touch abcdefghijklmnopqrstu vwxyz
$ mv $(ls | awk '{nr++; if (nr % 4 == 0) print $0}') destdir

于 2008-09-16T12:45:22.023 に答える
2

これを含むスクリプト move.sh を作成します。

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

実行可能にしてから、フォルダーでこれを行います。

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

これはファイル名のリストを取得し、一度に 4 つを move.sh に渡し、最初の 3 つを無視して 4 つ目を新しいフォルダーに移動します。

これは、番号が正確に連続していなくても機能します (たとえば、いくつかのフレーム番号が欠落している場合、mod 4 演算を使用しても機能しません)。

于 2008-09-16T12:46:35.280 に答える
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
于 2008-09-16T14:46:17.940 に答える
1

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

于 2008-09-16T12:43:50.200 に答える
1

ソートに関するマストの警告を考えると:

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

このソリューションで私が気に入っているのは、すべてが設計どおりに機能しているため、私には不安定に感じられることです。

于 2008-09-16T14:38:44.417 に答える
1
seq -f 'frame-%g.jpg' 1 4 number-of-frames

…必要なファイルの名前を出力します。

于 2008-09-16T12:48:09.473 に答える
0

これはかなり安っぽいですが、それは仕事を成し遂げるはずです。現在、すべてのファイルを含むディレクトリにcdされていると仮定します。

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

sort -nファイル名がすべて同じ桁数ではないことを前提としています。それ以外の場合は、前に来るls辞書式順序でソートされ、それがあなたが望むものではないと思います。frame-123.jpgframe-4.jpg

注意してください、私の解決策を試す前にあなたのファイルをバックアップしてください、等。私はあなたが一年分のデータを失うことに対して責任を負いたくありません。

このソリューションは、他のほとんどのソリューションとは異なり、名前にスペースが含まれるファイルを処理することに注意してください。これがサンプルファイル名の一部ではないことは知っていますが、スペースを安全に処理しないシェルコマンドを作成するのは簡単なので、この例ではそれを実行したいと思いました。

于 2008-09-16T12:58:55.030 に答える
0

ファイルのリストを反復するだけです:

files=( frame-*.jpg )
i=0
while [[ $i -lt ${#files} ]] ; do
  cur_file=${files[$i]}
  mungle_frame $cur_file
  i=$( expr $i + 4 )
done
于 2008-09-16T12:52:51.863 に答える