質問

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

そんな名前がつけられているんです……。

フレーム-44558.jpg

フレーム-44559.jpg

フレーム-44560.jpg

フレーム-44561.jpg

助けが必要な初心者から感謝します。


うまくいったようです。私の元の投稿にいくつかの間違いがありました。実際に28万枚の画像があり、ネーミングが行われました。/home/baldy/desktop/webcamimages/webcam_2007-05-29_163405.jpg /home/baldy/desktop/webcamimages/webcam_2007-05-29_163505.jpg/home/baldy/desktop/webcamimages/webcamimages/webcamimages/baldop。 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 -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 ラインを変更するにはどうすればよいですか?

役に立ちましたか?

解決

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

$ 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

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

これは、数字が正確に順番に並んでいない場合でも機能します (例:一部のフレーム番号が欠落している場合、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 )

ソートに関する masto の警告を考慮すると、次のようになります。

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

これはかなり安っぽいですが、これで仕事は完了するはずです。現在、すべてのファイルを含むディレクトリに 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 それはあなたが望んでいることではないと思います。

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top