【问题标题】:Reorganize folders with a script使用脚本重新组织文件夹
【发布时间】:2009-08-21 20:57:51
【问题描述】:

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

问题 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 描述/文件名.jpg

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

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

背景

我相信 bash 脚本会非常适合,但我也准备好在 python 中做一些事情了。
我使用的是 Ubuntu 9.04。

提前谢谢你。

【问题讨论】:

    标签: bash file directory


    【解决方案1】:

    试试这个。

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

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

    【讨论】:

      【解决方案2】:

      对于您的第二个请求,请尝试以下操作:

      #!/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)。

      作为一般性建议,将 find 的输出通过管道传输到 while read 循环中不仅适用于脚本 - 它是一种非常强大的单行技术,可以超越 find-exec 功能。

      【讨论】:

        【解决方案3】:

        我有一个简单的 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)
        

        【讨论】:

          【解决方案4】:

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

          尝试类似:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-11-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-10-20
            • 1970-01-01
            • 1970-01-01
            • 2017-09-15
            相关资源
            最近更新 更多