复制 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,那么我将创建 5 个新目录,每个目录中有 10 个帧(帧 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

相关内容