문제

나는 지난 해를 가리키는 1년 동안 실행시킨 웹캔 스크리브 그래버의 16,000 jpg를 가지고 있습니다.나는 매 4번째 이미지를 가져와 다른 디렉토리에 넣어 나중에 영화로 만들 수 있는 방법을 찾고 싶습니다.Linux에서 이 작업을 수행할 수 있는 간단한 bash 스크립트나 다른 방법이 있습니까?

그렇게 이름이 붙었군요......

프레임-44558.jpg

프레임-44559.jpg

프레임-44560.jpg

프레임-44561.jpg

도움이 필요한 뉴비에게 감사드립니다.


효과가 있었던 것 같습니다.내 원래 게시물에 몇 가지 오류가 있습니다.실제로 280,000개의 이미지가 있었고 이름은 이렇습니다./home/baldy/desktop/webcamimages/webcam_2007-05-29_163405.jpg /home/baldy/desktop/webcamimages/webcam_2007-05-29_163505.jpg/home/baldy/baldy/gooktop/webcamimages/webcam_200-05-29. JPG

나는 달렸다.cp $(ls | awk '{nr++;if (nr % 10 == 0) $0}') 인쇄 ../newdirectory/

이미지를 복사한 것으로 보입니다.겉보기에는 하루에 70-900입니다.

이제 mencoder mf : //*.jpg -mf w = 640 : h = 480 : fps = 30 : type = jpg -ovc lavc -lavcopts vcodec = msmpeg4v2 -nosound -o ../output-msmpeg4v2.avi

영화가 어떻게 진행되는지 알려드리겠습니다.

업데이트:영화가 작동하지 않았습니다.디렉토리에 2008년 이미지도 있지만 2007년 이미지만 있습니다.WebCAM_2008-02-17_101403.JPG WebCAM_2008-03-27_192205.JPG WEBCAM_2008-02-17_102403.JPG WEBCAM_2008-03-27_193205.JPG WEBCAM_2008-02-173403.JPG WEBCAM_2008-0-03403.JPG g webcam_2008-02-17_104403.jpg webcam_2008 -03-27_195205.jpg

모든 이미지를 사용하도록 Mencoder 라인을 어떻게 수정합니까?

도움이 되었습니까?

해결책

한 가지 간단한 방법은 다음과 같습니다.

$ touch a b c d e f g h i j k l m n o p q r s t u v w x y z
$ mv $(ls | awk '{nr++; if (nr % 4 == 0) print $0}') destdir

다른 팁

다음을 포함하는 move.sh 스크립트를 만듭니다.

#!/bin/sh
mv $4 ../newdirectory/

실행 가능하게 만든 다음 폴더에서 다음을 수행하십시오.

ls *.jpg | xargs -n 4 ./move.sh

이는 파일 이름 목록을 가져와 한 번에 4개를 move.sh에 전달한 다음 처음 3개를 무시하고 네 번째를 새 폴더로 이동합니다.

이는 숫자의 순서가 정확히 일치하지 않는 경우에도 작동합니다(예:일부 프레임 번호가 누락된 경우 Mod 4 산술을 사용하면 작동하지 않습니다.

제안된 대로

seq -f 'frame-%g.jpg' 1 4 number-of-frames

280k 파일에서는 'ls'가 실패하므로 파일 이름 목록을 생성합니다.따라서 최종 솔루션은 다음과 같습니다.

for f in `seq -f 'frame-%g.jpg' 1 4 number-of-frames` ; do
  mv $f destdir/
done
seq -f 'frame-%g.jpg' 1 4 number-of-frames

...필요한 파일 이름을 인쇄합니다.

Perl에서 쉬운 방법(아마도 bash에 쉽게 적응할 수 있음)은 파일 이름을 배열로 저장한 다음 시퀀스 번호를 얻고 4로 나눌 수 없는 파일 이름을 제거하는 것입니다.

다음과 같이 필요한 파일이 인쇄됩니다.

ls -1 /path/to/files/ | perl -e 'while (<STDIN>) {($seq)=/(\d*)\.jpg$/; print $_ if $seq && $seq % 4 ==0}'

이동으로 인쇄물을 교체할 수 있습니다.

자릿수가 일정하지 않더라도 파일에 순서대로 번호가 매겨지면 작동합니다. file_9.jpg 이어서 file_10.jpg )

정렬에 대한 Masto의 주의사항은 다음과 같습니다.

ls | sed -n '1~4 p' | xargs -i mv {} ../destdir/

이 솔루션에서 제가 좋아하는 점은 모든 것이 설계된 대로 작동한다는 것입니다. 그래서 저에게는 유별난 느낌이 듭니다.

파일 목록을 반복하면 됩니다.

files=( frame-*.jpg )
i=0
while [[ $i -lt ${#files} ]] ; do
  cur_file=${files[$i]}
  mungle_frame $cur_file
  i=$( expr $i + 4 )
done

꽤 유치하지만 작업이 완료되어야 합니다.현재 모든 파일이 포함된 디렉토리에 CD로 저장되어 있다고 가정합니다.

mkdir ../outdir
ls | sort -n | while read fname; do mv "$fname" ../outdir/; read; read; read; done

그만큼 sort -n 파일 이름의 자릿수가 모두 같지 않다고 가정합니까?그렇지 않으면 ls 어휘 순서로 정렬됩니다. frame-123.jpg 전에 온다 frame-4.jpg 내 생각엔 그게 당신이 원하는 게 아닌 것 같아요.

내 솔루션 등을 시도하기 전에 파일을 백업하십시오.나는 당신이 1년치의 데이터를 잃어버린 것에 대해 책임을 지고 싶지 않습니다.

이 솔루션은 대부분의 다른 솔루션과 달리 이름에 공백이 있는 파일을 처리합니다.이것이 샘플 파일 이름의 일부가 아니라는 것을 알고 있지만 공백을 안전하게 처리하지 않는 셸 명령을 작성하는 것은 쉽기 때문에 이 예에서는 그렇게 하고 싶었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top