用于对目录结构中的文件进行分类的脚本yyyy / mm / dd

时间:2015-08-02 19:56:52

标签: python shell

我在目录中有超过一百万张图片。这些图像多年来一直在使用,并希望每天使用mencoder创建一个游戏中时光倒流。

文件的日期格式如下:image_2015-07-19_14_48_47.951.jpg以及它们的时间戳是否正确。

我想运行一个脚本来分类,将它们移动到目录结构中,如下所示:yyyy / mm / dd / image_yyyy-mm-dd_hh_mm_ss.951.jpg

此外,每分钟都会添加更多文件,这个脚本每天都要运行,以便分类到dir结构中,mencode到x264,然后压缩屏幕截图。

我如何使用Python实现这一目标?

2 个答案:

答案 0 :(得分:1)

这是一个解决方案。它的一个问题是它假设目录结构存在(即如果它将图像移动到2015/03/03,它不会检查该目录结构是否存在)。

source_dir = r'C:\Users\test\Desktop\test'
target_dir = r'C:\Users\test\Desktop\test2'

def classify_images():
    import os

    def get_ymd(path, delim='_', delim2='-'):
        start_idx = path.find(delim)
        if start_idx < 0: return None

        stop_idx = path.find(delim, start_idx+1)
        if stop_idx < 0: return None

        ymd = path[start_idx+1:stop_idx]
        return ymd.split(delim2)

    if os.path.isdir(source_dir):
        dir_entries = os.listdir(source_dir)
        for entry in dir_entries:
            ymd = get_ymd(entry)
            if ymd is None or len(ymd) < 3:
                print 'Couldn\'t classify %s' % entry
                continue

            new_path = os.path.normpath(target_dir + r'\%s\%s\%s' % (ymd[0], ymd[1], ymd[2]))
            old_path = os.path.normpath(source_dir + '\\' + entry)

            # move file
            os.rename(old_path, new_path)

答案 1 :(得分:1)

你可以在shell中相当整齐地做到这一点,而不是需要python。这是kornshell:

ls -1tr | while read f
do
  if [[ -f $f && $f == image_*-*-*_* ]]
  then
    echo $f | ( IFS=_ read prefix_unwanted ymd rest_unwanted ; echo $ymd ) | IFS=- read y m d

    [[ -n $y && -n $m && -n $d ]] && mkdir -p $y/$m/$d && mv $f $y/$m/$d
  fi
done

因此,使用IFS(字段分隔符)将文件名拆分两次 - 一次将年 - 星期一视为一,然后再拆分该部分。

mkdir -p只有mks目录,如果不存在,那么相当快。

在bash上,第二次读取将不起作用,因此请使用变量替换$ {ymd // - //}:

 echo $f | ( IFS=_ read prefix_unwanted ymd rest_unwanted ; mkdir -p ${ymd//-/\/} && mv $f ${ymd//-/\/} )

Bourne shell无法管理上述内容 - 它无法通过通配符比较在[[]]中进行扩展测试。

唯一可能是问题的是,如果这些jpgs打开并关闭它们并再次打开它们,因为mv会修改inode并且如果它选择了仍在编写的文件,那么&只有你能确定作者一次完成所有事情并完成(因为作者不知道inode被移动了),这是唯一的好。)

我假设这是unix平台 - 如果它的Windows可能不太合适。