質問
私にはウェブカンのスクリーブグラバーから取得した 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 年分のデータを失ったことに対して責任を負いたくないのです。
このソリューションは、他のほとんどのソリューションとは異なり、名前にスペースが含まれるファイルを処理することに注意してください。これがサンプル ファイル名の一部ではないことはわかっていますが、スペースを安全に処理できないシェル コマンドを作成するのは簡単なので、この例ではそれを実行したいと考えました。