2015-11-13 119 views
2

我在建築物中設置了3個攝像頭,將靜止圖像上傳到網絡服務器。我使用ffmpeg將jpgs編碼爲mp4視頻。Bash:使用部分文件名排序查找結果

的目錄都設置這樣的:

Cam1/201504 
Cam1/201505 
Cam2/201504 
Cam2/201505 
Cam3/201504 
Cam3/201505 

我使用以下的bash循環/ ffmpeg的參數,使每一個攝像頭視頻,每年。這種運作良好,到目前爲止,(嗯......除了我的SSD在性能迅速降低 - 太多的同步讀/寫操作):

find Cam2/2013* -name "*.jpg" -print0 | xargs -0 cat | ffmpeg -f image2pipe -framerate 30 -vcodec mjpeg -i - -vcodec libx264 -profile:v baseline -level 3.0 -movflags +faststart -crf 19 -pix_fmt yuv420p -r 30 "Cam2-2013-30fps-19crf.mp4" 

的各個文件被命名爲這樣的(混淆FFmpeg的內置文件序):

Cam1_2015052413543201.jpg 
Cam1_2015052413544601.jpg 
Cam2_2015052413032601.jpg 
Cam2_2015052413544901.jpg 

我現在需要在所有3臺攝像機,通過時間戳下令創建一個視頻整整一年。爲了做到這一點,我需要在下劃線後按文件名的段來排列查找結果。

我該如何管理查找輸出來完成此操作?例如,上面的文件將這樣排序:

Cam2_2015052413032601.jpg 
Cam1_2015052413543201.jpg 
Cam1_2015052413544601.jpg 
Cam2_2015052413544901.jpg 

任何幫助非常感謝!

回答

3

排序

sort -t '_' -nk2 

-t '_'#sp假設字段分隔符應該是下劃線

-nk2#從第二個字段開始排序(在下劃線之後)..n根據數值排序/時間戳

輸出

Cam2_2015052413032601.jpg 
Cam1_2015052413543201.jpg 
Cam1_2015052413544601.jpg 
Cam2_2015052413544901.jpg 

管排列來查找命令一樣

sort -t '_' -nk2 --files0-from=- 
2

使用sort--key選項。有關密鑰格式的詳細信息,請參閱您的手冊頁sort。通常(對於coreutils和BSD sort)應該是F[.C][OPTS][,F[.C][OPTS]],其中F是用於字段,而C用於字符位置。在這裏,你希望從第一場的第5個字符排序,所以--key=1.5會做:

> echo -e 'Cam1_2015052413543201.jpg\nCam1_2015052413544601.jpg\nCam2_2015052413032601.jpg\nCam2_2015052413544901.jpg' | sort --key=1.5 
Cam2_2015052413032601.jpg 
Cam1_2015052413543201.jpg 
Cam1_2015052413544601.jpg 
Cam2_2015052413544901.jpg 

在這裏,你似乎不僅基本名稱中的find輸出,但像Cam1/201505/前綴路徑段相對路徑,但你仍然可以計算字符的數量,因此可以編寫適當的keydef。例如,假設上面例子中的圖像的路徑是

Cam1/201505/Cam1_2015052413543201.jpg 
Cam1/201505/Cam1_2015052413544601.jpg 
Cam2/201505/Cam2_2015052413032601.jpg 
Cam2/201505/Cam2_2015052413544901.jpg 

然後

sort --key=1.17 

會給你正確的順序

Cam2/201505/Cam2_2015052413032601.jpg 
Cam1/201505/Cam1_2015052413543201.jpg 
Cam1/201505/Cam1_2015052413544601.jpg 
Cam2/201505/Cam2_2015052413544901.jpg 
+0

這適用於較短的名單,但我使用xargs的,因爲我碰到「/bin/cat:參數列表太長「,而且列表很大。我如何將它與xargs寫成的命令結合起來? – utt50

+0

'find blah blah |排序等等等等xargs等等等等。那有什麼問題?順便說一下,其他答案比我的好。 – 4ae1e1

+0

,因爲這不適用於此類。我想我不明白xargs。這是我的命令:'find */201111/* 20111130 * -name「* .jpg」-print0 | sort -t'_'-nk2 | xargs -0 cat | ffmpeg -f image2pipe -framerate 30 -vcodec mjpeg -i -vcodec libx264 -profile:v baseline -level 3.0 -movflags + faststart -crf 19 -pix_fmt yuv420p -r 30「output.mp4」' – utt50