Bash
過濾文件列表以僅在某個文件之後按字母順序顯示文件
我有大量的圖像,我想
ffmpeg
不時提供一些圖像。但我只想提供在某些圖像****之後按字母順序排列的圖像(上一次執行的最後一幀,名稱儲存在某個文件中)。例如,我可以找出那個文件的訂單/索引號,然後執行
head
/tail
使用該號碼嗎?還是有一些
-pattern_type glob
我可以用作ffmpeg -i
參數的魔法?迄今為止最好的過濾解決方案似乎是這樣,但它似乎有點沉重:
find . -maxdepth 1 -type f | sort | awk '$0 > "./picture_2022-04-22_13-46-12.jpg"'
一種替代方法是將列表放入文本文件中,在那裡進行解析並將文本文件提供給 ffmpeg,但我想有一些更簡單的方法嗎?
排序後, some
sed
orawk
可用於匹配從模式到流結束。我假設您的最終ffmpeg
命令接受文件參數列表。我用 aprintf
而不是ffmpeg
下面。find . -type f -print0 | sort -z | sed -nz '/pattern/,$p' | xargs -r0 printf '%s\n'
使用 GNU 參數分隔。
sed
命令過濾排序的參數,從模式(包括)到流的末尾。如果您想從模式中獲取文件,直到,而不是結束,而是直到第二個模式,唯一的修改是 .
sed
,它變成sed -zn '/pattern1/,/pattern2/p'
.對於我們不測試正常文件的情況(深度 1),一個較短的替代方案是:
printf '%s\0' ./*.jpg | sed -nz '/pattern/,$p' | xargs -r0 printf '%s\n'
在第一步之後,這裡的文件已經按字母順序排序。
此外,您可以與一個字元串進行比較,不一定存在於文件名中,不包括或包括,最
awk
好像你已經做的那樣使用。例如,獲取所有命名日期晚於的文件2022-01
:printf '%s\0' ./*.jpg | awk 'BEGIN {RS=ORS="\0"} $0 > "./picture_2022-01"' | xargs -r0 printf '%s\n'