연속 번호가 붙은 파일 10개 복사

연속 번호가 붙은 파일 10개 복사

다음과 같은 파일 구조가 있습니다.

Project
 |    
 +-- video_1
 |  |  
 |  +-- video_1_cropped
 |      |
 |      +--frame_00000.jpg
 |      +--frame_00001.jpg
 |      +...
 |      +—-frame_00359.jpg
 |    
 +-- video_2
 |  |  
 |  +-- video_2_cropped
 |      |
 |      +--frame_00000.jpg
 |      +--frame_00004.jpg
 |      +--frame_00005.jpg
 |      +…
 |      +—frame_00207.jpg
 |    

이제 이러한 프레임은 이전에 처리되었으며 모든 프레임을 처리할 수 있는 것은 아니기 때문에 모두 연속적으로 번호가 지정되지는 않습니다. 이 모든 디렉토리를 반복하여 10개의 프레임에 연속적으로 번호가 매겨져 있는지 확인하고 이를 다른 디렉토리에 복사하여 거기에도 새 디렉토리를 만드는 것이 가능한지 궁금합니다. 새 디렉터리는 다음과 같습니다.

Videos
 |
 +-- video_00001
 |  |  
 |  +--frame_00000.jpg
 |  +--frame_00001.jpg
 |  +...
 |  +--frame_00009.jpg
 |
 +-- video_00002
 |  |  
 |  +--frame_00013.jpg
 |  +--frame_00014.jpg
 |  +...
 |  +--frame_00022.jpg
 ...

몇 가지 추가 참고사항,

(1) 동일한 비디오에서 여러 개의 10개 프레임 시퀀스를 복사할 수 있기를 원합니다(해당 시퀀스가 ​​여러 개인 경우).

(2) 영상에 10프레임 시퀀스가 ​​없을 경우 건너뛸 수 있습니다.

(3) 시퀀스가 ​​10프레임보다 길면 여전히 10프레임 시퀀스로 분할하고 싶습니다. 따라서 프레임 번호가 10-59이면 각 디렉터리에 10개의 프레임이 있는 5개의 새 디렉터리를 만듭니다(프레임 10-19, 20-29 등).

(4) 소스 비디오는 서로 관련되어서는 안 됩니다. 10프레임 시퀀스를 새 디렉토리에 복사할 때 어차피 동일한 하위 디렉토리에 있지 않기 때문입니다. 따라서 서로 다른 비디오에서 동일한 시퀀스(예: 20-29)를 여러 번 복사할 수 있어야 합니다.

답변1

나는 이를 위해 Python 스크립트를 작성하기로 결정했습니다. 관심 있는 사람이 있으면 코드를 작성하세요.

def process_pictures():
    video_directory = '/path/to/videos/'
    new_directory = '/path/to/sequences'
    new = 1

    for subdir, dirs, files in os.walk(video_directory):
        if subdir[-7:] == 'cropped':
            curr = -1
            count = []
            for file in sorted(files):
                # get number
                number = int(file[-9:-4])
                # if the next file is consecutive
                if number == curr + 1:
                    # increment current and add file to list
                    curr += 1
                    count.append(file)
                    # if we found 10 files
                    if len(count) == 10:
                        # zero pad new folder to be made
                        video_num = f'{new:05d}'
                        new += 1
                        dir_name = new_directory + '/video_' + video_num
                        # try to make new directory
                        try:
                            # Create target Directory
                            os.mkdir(dir_name)
                            print("Directory " , dir_name ,  " Created ") 
                        except FileExistsError:
                            print("Directory " , dir_name ,  " already exists")
                        # loop through files and copy them to new directory
                        for f in count:
                            shutil.copy(os.path.join(subdir, f), dir_name)
                        
                        # create new empty list
                        count = []
                # if number is not consecutive, we reset the list and the current number
                else:
                    count = [file]
                    curr = number

답변2

그리고 zsh:

typeset -Z5 destn=0
for dir in Project/video_<->/video_<->_cropped(Nn/); do
  files=() i=
  for file in $dir/*_<->.jpg(Nn.); do
    num=${(M)${file:r}%%<->}
    if [[ -z $i ]] || (( num == i + 1)); then
      files+=($file)
      if (( $#files == 10 )); then
        (( destn++ ))
        destdir=Videos/video_$destn
        mkdir -p $destdir && cp $files $destdir/
        files=() i=
        continue
      fi
    else
      files=($file)
    fi
    i=$num
  done
done

관련 정보