使用脚本重新组织文件夹

时间:2009-08-21 20:57:51

标签: bash file directory

在过去的几年里,我有不同类型的软件来组织我的照片和音乐收藏。这导致了目录结构的差异,我希望这是统一的。

问题a:音乐收藏

我希望我的音乐收藏品看起来像:/Artist/Album/files.*
但现在有几个/A/Artist/Album/files.*

的实例

我正在尝试编写一个脚本: 1.查找包含1个字符的所有文件夹,
2.将每个单字符文件夹的内容移动到/ Artist /
(展平结构,并在文件名中处理空格)

find ./Artists/ -name "?" -maxdepth 1 -mindepth 1 | mv * ./Artists/

半途而废,但它不处理目录名中的空格,而且我有点不确定它是否还有其他陷阱。

问题b:照片集

我的情况非常相似,我的大部分收藏品看起来都像是我想要的。 期望:
    / Photos / 2009 / 2009-08-07 description / filename.jpg

现状:
    /Photos/2009/03/21/filename.jpg

我需要一个脚本: 1.找到所有符合/ yyyy / mm / dd /
的文件夹 2.将内容移至/ yyyy-mm-dd /
3.删除旧文件夹

背景

我相信一个bash脚本非常适合,但我也准备好了python中的东西 我正在使用Ubuntu 9.04。

提前谢谢。

4 个答案:

答案 0 :(得分:1)

试试这个。

find ./Artists/ -name "?" -maxdepth 1 -mindepth 1 -exec mv {} ./Artists/ \;

传递find的输出会丢失文件名和单独文件中的空格之间的区别。 -exec将在每个找到的文件上执行mv,一次一个。 -ok做同样的事情,但首先要求你确认。

答案 1 :(得分:0)

我有一个简单的Python脚本。虽然您的案例非常具体,但我更喜欢通过查看EXIF信息将照片分发到单独的文件夹。它将照片从SRC复制到DST,在那里为每天创建一个文件夹。它使用EXIF.py.所以这就是:

import  EXIF, os, re, shutil, sys

__date__ ="$Jun 4, 2009 1:27:16 PM$"

if __name__ == "__main__":
    if len(sys.argv) < 3:
        print "No params given. PhotoDispatcher.py <SRC> <DST>" 
        exit(1)
    src = sys.argv[1]
    dst = sys.argv[2]
    for path, directories, files in os.walk(src):
        for filename in files:
        curfile = src+'/'+filename
            f = open(curfile, 'rb');
        tags = EXIF.process_file(f, stop_tag='EXIF DateTimeOriginal')
    f.close()
        try: dateTimeOrig = tags['EXIF DateTimeOriginal'].__str__()[0:10]
    except KeyError:
        print "unable to read DateTimeOriginal tag", filename
        continue
        dirName = re.sub(':','.', dateTimeOrig) 
        newdir = dst+'/'+dirName
    try: os.mkdir(newdir)
    except os.error:
       print "unable to create directory: ", os.error
        newfile = newdir+'/'+filename
    print curfile, '-->', newfile
        shutil.move(curfile, newfile)

答案 2 :(得分:0)

对于您的第二个请求,请尝试以下方式:

#!/bin/bash
find $PHOTO_DIR -regextype posix-extended -type d -regex '.*/[0-9]{4}/[0-9]{2}/[0-9]{2}$' |
while read dir; do
    newdir="$(echo $dir | sed 's@/\([0-9]\{4\}\)/\([0-9]\{2\}\)/\([0-9]\{2\}\)$@/\1-\2-\3@')"
    mv "$dir" "$newdir"
    rmdir "$(dirname $dir)"
    rmdir "$(dirname $(dirname $dir))"
done

这对我的简单测试用例来说很好;为了确保它适合您,请在三个操作行(echo和两个mv)前放置rmdir

作为一些一般建议,将管道​​查找输出放入while read循环不仅仅适用于脚本 - 它是一种非常强大的单行技术,可以超越find {{1}能力。

答案 3 :(得分:0)

使用find的-print0和xargs'-0来处理空格。

尝试类似:

find [A-Z]/* -type d -maxdepth 1 -mindepth 1 -print0 \
| xargs -r0 -I'{}' mv {} Artists/