Command-Line

如何僅對具有特定創建日期的文件使用 mogrify convert?

  • October 11, 2016

我正在使用 mogrify 的convert. 但是,目前我在一個包含數十張圖像的文件夾中執行,我只是指示它使用它找到的所有圖像。但是,我希望它只使用在特定日期創建的文件。我能做這樣的事嗎?

目前使用的命令:

convert -delay 10 -loop 0 images/* animation.gif

我所有的文件名都是時間戳,所以或者我希望能夠指定一個範圍,例如:

convert -delay 10 -loop 0 --start="images/147615000.jpg" --end="images/1476162527.jpg" animation.gif

我已經嘗試了convert手冊頁,但沒有運氣。這有可能嗎?

這個小 shell 腳本將遍歷目前目錄中的每個文件,並將其最後修改的時間戳與由startend時間戳建構的範圍(此處為 10 月 10 日)進行比較。匹配的文件被添加到files數組中,如果數組中有任何文件,它就會呼叫convert它們。如果您想擁有至少兩個(或更多)文件,請調整-gt 0至。-gt 1

請注意,創建時間通常不會保存在文件的 (Unix) 屬性中,因此此方法可能會被簡單的 欺騙touch 1476158400.jpg,這會使舊文件看起來是新的。請參閱下面的第二個選項。

#!/usr/bin/env bash

start=$(date +%s -d 'Oct 10 2016')
end=$(date +%s -d 'Oct 11 2016')

files=()
for f in *
do
 d=$(stat -c%Z "$f")
 [[ $d -ge $start ]] && [[ $d -le $end ]] && files+=("$f")
done

[[ ${#files[*]} -gt 0 ]] && convert -delay 10 -loop 0 "${files[*]}" animation.gif

或者,如果文件名本身對創建時間戳進行編碼,那麼您可以使用蠻力循環來查找它們:

start=$(date +%s -d 'Oct 10 2016')
end=$(date +%s -d 'Oct 11 2016')
files=()
for((i=start;i<=end;i++)); do [[ -f "${i}.jpg" ]] && files+=("${i}.jpg"); done
[[ ${#files[*]} -gt 0 ]] && convert -delay 10 -loop 0 "${files[*]}" animation.gif

引用自:https://unix.stackexchange.com/questions/315596