특정 파일 다음에 알파벳 순서로 파일만 표시하도록 파일 목록을 필터링합니다.

특정 파일 다음에 알파벳 순서로 파일만 표시하도록 파일 목록을 필터링합니다.

나는 때때로 제공하고 싶은 많은 이미지 컬렉션을 가지고 있습니다 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이 명령은 패턴(포함)부터 스트림 끝까지 정렬된 인수를 필터링합니다.

끝이 아닌 두 번째 패턴까지 패턴에서 파일을 가져오려면 유일한 수정 sedsed -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) .$lastfind -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
)

관련 정보