나는 때때로 제공하고 싶은 많은 이미지 컬렉션을 가지고 있습니다 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에 공급하는 것입니다. 하지만 더 쉬운 방법이 있을까요?
답변1
정렬 후 some sed
또는 를 사용하여 awk
패턴부터 스트림 끝까지 일치시킬 수 있습니다. 최종 ffmpeg
명령이 파일 인수 목록을 허용한다고 가정합니다. 나는 다음을 a로 printf
대체했습니다 .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'
답변2
그리고 zsh
:
last=picture_2022-04-22_13-46-12.jpg
# or last=$(<file_that_contains_the_filename)
ffmpeg ... picture_*.jpg(e['[[ $REPLY > $last ]]'])
이것은 e
평가를 사용하고 있습니다글로벌 예선평가 코드가 true를 반환하는 파일로 전역 확장을 제한합니다.
[[ $REPLY -nt $last ]]
파일 선택을 n
참조 하세요 ( 와 유사 t
) .$last
find -newer
을 사용하면 bash
다음과 같은 작업을 수행할 수 있습니다.
last=picture_2022-04-22_13-46-12.jpg
(
shopt -s nullglob
files=()
for file in picture_*.jpg; do
if [[ $file > $last ]]; then
files+=("$file")
fi
done
if (( ${#files[@]} > 0 )); then
ffmpeg ... "${files[@]}"
else
echo >&2 No match; exit 1
fi
)