현재 작업 디렉토리의 하위 디렉토리 내에서 여러 일련의 이미지 시퀀스를 가져 와서 ffmpeg를 통해 전송하여 디렉토리 이름을 딴 현재 작업 디렉토리에 비디오 파일을 만드는 스크립트를 만들려고합니다. 시퀀스의 시작 번호와 마찬가지로 이미지 시퀀스 이름이 다양하다는 사실로 인해 복잡하지만 실제 문제는 bash 스크립팅을 처음 사용한다는 것입니다. 다음은 파일의 예입니다.
directoryFirstRender01
renderOne0032.png
renderOne0033.png
renderOne0034.png
directoryFourthRender01
renderFour4253.png
renderFour4254.png
renderFour4255.png
directoryFifthRender01
renderFiveTwo1367.png
renderFiveTwo1368.png
renderFiveTwo1369.png
다음은 내가 알고있는 몇 가지 문제와 내가 알지 못하는 더 많은 문제가있는 스크립트의 대략적인 개요입니다. 내가 얼마나 많은 문제가 있는지 모르는 이유는 파일 이름을 가져오고 구문 분석하는 데 어려움을 겪었 기 때문에 작동하지 않으면 나머지를 테스트 할 수 없기 때문입니다.
#!/bin/bash
for DIR in (ls -d */); do
1STFILE=(ls $dir/ | sort -n | head -1)
STARTNO=${1STFILE:(-8):4}
IMGSEQ=${1STFILE%????.*}
EXTEN=${1STFILE*.}
ffmpeg -start_number $STARTNO -i $IMGSEQ%04d.$EXTEN $DIR.mkv
done
내가 알고있는 현재 주요 문제는 다음과 같습니다.
ls dir/ | sort -n | head -1
터미널에서는 작동하지만 스크립트에서는 작동하지 않습니다.renderSix00001.png-renderSix99999.png
과 renderSeven001.png-renderSeven999.png
도는? 그것은 또한 점점 라인에 문제가있어 $IMGSEQ
, 그리고 %04d
ffmpeg라는 라인은 어떻게 든 변화 될 필요가있다.$IMGSEQ
변수 믹싱에 문제가있을 것이라고 생각 %04d
하지만 아직까지는 그렇게하지 않았습니다. 내가 거기에 사용 무엇을 할 구문 $IMGSEQ(%04d).$EXTEN
또는 $IMGSEQ {%04d}.$EXTEN
어쩌면? (이렇게 많은 사람들이 스크립팅의 깊은 끝에서 점프하는 것이 짜증나는 이유입니다)ls
in을 사용 하는 for DIR in (ls -d */)
것이 눈살을 찌푸리는 것을 알고 있지만 현재 작업 디렉토리에서 파일을 필터링하고 디렉토리에서 작업하는 다른 방법을 모릅니다.)스크립트가 완전히 엉망인 것 같습니다. 전체 작업을 수행하기위한 전반적인 지침은 매우 환영 할 것입니다. 그러나 파일 이름을 가져오고 구문 분석하는 데 도움을받을 수 있다면 전체 작업을 안내 할 인내심이없는 사람이 있으면 나머지는 직접 수정할 수 있습니다. 감사합니다.
다시 감사합니다 Ron! 이것은 거의 최종 스크립트입니다.
#!/bin/bash
for DIR in $(ls -d */)
do
FIRSTFILE=$(ls $DIR | sort -n | head -1)
STARTNO=$(echo $FIRSTFILE | grep -Eo "[0-9]+")
DIGITNO=${#STARTNO}
IMGSEQ=${FIRSTFILE%????.*}
EXTEN=${FIRSTFILE#*.}
OUTPUT=${DIR%/}
ffmpeg -start_number $STARTNO -i "$DIR$IMGSEQ"%0"$DIGITNO"d".$EXTEN" $OUTPUT.mkv
done
Ron 덕분에 $STARTNO
변수는 이제 여러 자릿수 길이를 허용하므로 $DIGITNO
줄 에서 길이 매개 변수 확장 을 사용하여 %04d
부품 에서 사용할 번호를 얻 %03d
거나 %05d
필요에 따라 작동합니다. 주변 변수 와을 "
분리하기 위해의 자유로운 사용이 %04d
나쁜 형식으로 간주되지 않기를 바랍니다 (그렇다면 올바른 방법은 무엇입니까?). 스크립트에서 유일하게 빠진 부분은 $IMGSEQ
여러 자리 길이를 받아들이 는 방법 입니다. 지금은 그것에 대한 아이디어가 없습니다. 아는 사람이 있다면 알아 주면 감사하겠습니다.하지만 마치 한 번의 평생 동안 그 이상을 가지고 있지 않은 것처럼 매개 변수 확장 문서를 살펴보면 찾을 수있을 것입니다. :)
알아 냈어! 에 대한 론의 제안에 따라 작업을 (받는 방법 IMGSEQ은 그 여러 자리의 길이를 포함하는 이름을 허용하기 위해) $STARTNO
사용 (echo $FIRSTFILE | grep -Eo "[0-9]+")
내가 함께했다
IMGSEQ=$(echo ${FIRSTFILE%.*} | grep -iEo "[a-z]+")
${FIRSTFILE%.*}
첫 번째 파일을 취하고 확장자를 제거합니다.-i
일부는 -iEo
grep이 대문자 및 소문자 패턴 일치를 허용하도록하는 것입니다.-E
일부는 "PATTERN을 확장 정규식으로 해석" -iEo
하는 것입니다 (에서 인용 man grep
). 무엇을 의미 하던지.-o
부분은 -iEo
일치하는 패턴 만 인쇄하는 것입니다.[a-z]
알파벳 문자의 패턴과 일치하는 것입니다.+
grep에게 이전 알파벳 패턴이 "한 번 이상"일치해야한다고 알려줍니다 (모든 문자를 얻으려면 반복해서 수행).그 한계는이 같은 특수 문자가 포함 된 파일 이름을 처리 할 것입니다 -
또는 _
,하지만 지금은 그와 함께 살 수 있습니다.
그래서 여기에 준결승 대본이 있습니다!
#!/bin/bash
for DIR in $(ls -d */)
do
FIRSTFILE=$(ls $DIR | sort -n | head -1)
STARTNO=$(echo $FIRSTFILE | grep -Eo "[0-9]+")
DIGITNO=${#STARTNO}
IMGSEQ=$(echo ${FIRSTFILE%.*} | grep -iEo "[a-z]+")
EXTEN=${FIRSTFILE#*.}
OUTPUT=${DIR%/}
ffmpeg -n -start_number $STARTNO -i "$DIR$IMGSEQ"%0"$DIGITNO"d".$EXTEN" $OUTPUT.mkv
done
따라서 위의 예제 디렉토리와 같은 이름의 일부 디렉토리가있는 디렉토리에서 실행합니다 (하지만 작동하는지 확인하기 위해 4 개 이상의 0으로 채워진 이미지 시퀀스가있는 디렉토리를 추가 한 경우 제외),이 스크립트는 다음 ffmpeg 행을 차례로 실행합니다.
ffmpeg -n -start_number 0032 -i directoryFirstRender01/renderOne%04d.png directoryFirstRender01.mkv
ffmpeg -n -start_number 4253 -i directoryFourthRender01/renderFour%04d.png directoryFourthRender01.mkv
ffmpeg -n -start_number 01367 -i directoryFifthRender01/renderFiveTwo%05d.png directoryFifthRender01.mkv
완벽 해! Ron을 도와 주셔서 다시 한 번 감사드립니다! 당신의 도움 없이는 끝낼 수 없었을 것입니다.
디렉토리에서 첫 번째 파일의 파일 이름을 얻는 방법을 모르겠습니다. ls dir / | 정렬 -n | head -1은 터미널에서 작동하지만 스크립트에서는 작동하지 않습니다.
다시 작성하는 것이 좋습니다.
for DIR in (ls -d */); do
1STFILE=(ls $dir/ | sort -n | head -1)
같이
for DIR in (ls -d */)
do
1STFILE=$(ls $DIR | sort -n | head -1)
받아 들일 수 있도록하는 방법이 있나요
renderSix00001.png-renderSix99999.png
과renderSeven001.png-renderSeven999.png
도는?
위의 내용을 따랐다면 :
STARTNO=$(echo $1STFILE | grep -Eo "[0-9]+")
파일 이름에있는 모든 숫자를 가져와야합니다.
내가 거기에 사용 무엇을 할 구문
$IMGSEQ(%04d).$EXTEN
또는$IMGSEQ {%04d}.$EXTEN
어쩌면?
그 안에 넣습니다 ""
.
ffmpeg -start_number $STARTNO -i "$IMGSEQ%4d.$EXTEN" "$DIR.mkv"
이제 사용 "$IMGSEQ%4d.$EXTEN"
하면 문제가 발생할 것입니다 (그게 무엇인지 확인하십시오!). 그러니 만들어"$DIR$IMGSEQ%4d.$EXTEN"
사용 하면 원하는 것이 아닌 "$DIR.mkv"
숨겨진 파일 .mkv
이 생성 됩니다. 내가 생각한별로 멋지지 않은 방법 /
은 변수 에서 접미사 를 제거하여 디렉토리 이름 만 저장 하는 것입니다.
OUTPUT=$(echo $DIR | sed 's/\/$//')
다음과 같이 사용하십시오 ffmpeg
.
ffmpeg -start_number $STARTNO -i "$DIR$IMGSEQ%4d.$EXTEN" "$OUTPUT.mkv"
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다