Bash 使用脚本重新组织文件夹

Bash 使用脚本重新组织文件夹,bash,file,directory,Bash,File,Directory,在过去的几年里,我有不同类型的软件来组织我的照片和音乐收藏。这导致了目录结构的差异,我希望这是统一的 问题a:音乐收藏 我希望我的音乐收藏看起来像:/Artist/Album/files.* 但是现在有几个/A/Artist/Album/files.* 我正试图写一个脚本: 1.查找包含1个字符的所有文件夹, 2.将每个单字符文件夹的内容移动到/Artist/ (展平结构,并处理文件名中的空格) 让我半途而废,但它不处理目录名中的空格,而且我有点不确定它是否还有其他缺陷 问题b:照片收集 我在这

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

问题a:音乐收藏

我希望我的音乐收藏看起来像:
/Artist/Album/files.*

但是现在有几个
/A/Artist/Album/files.*

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

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

问题b:照片收集

我在这里有一个非常相似的情况,我的大部分收藏看起来像是我想要的。 所需:
/Photos/2009/2009-08-07 description/filename.jpg

当前情况:
/照片/2009/03/21/filename.jpg

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

背景

我相信bash脚本非常适合,但我也已经准备好使用python了。
我正在使用Ubuntu 9.04


提前谢谢。

我有一个简单的Python脚本。虽然您的案例非常具体,但我更喜欢通过查看照片的EXIF信息将照片发送到单独的文件夹。它将照片从SRC复制到DST,并在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)
导入EXIF、os、re、shutil、sys __日期:“(2009年6月4日下午1:27:16$” 如果名称=“\uuuuu main\uuuuuuuu”: 如果len(sys.argv)<3: 打印“未提供参数.PhotoDispatcher.py” 出口(1) src=sys.argv[1] dst=sys.argv[2] 对于os.walk(src)中的路径、目录和文件: 对于文件中的文件名: curfile=src+'/'+文件名 f=打开(curfile,'rb'); tags=EXIF.process\u文件(f,stop\u tag='EXIF DateTimeOriginal') f、 关闭() try:dateTimeOrig=tags['EXIF DateTimeOriginal'].\uuuu str\uuuu()[0:10] 除KeyError外: 打印“无法读取DateTimeOriginal标记”,文件名 持续 dirName=re.sub(“:”,“.”,dateTimeOrig) newdir=dst+'/'+dirName try:os.mkdir(newdir) 除操作系统错误外: 打印“无法创建目录:”,操作系统错误 newfile=newdir+'/'+文件名 打印当前文件“-->”,新文件 move(curfile,newfile)
我有一个简单的Python脚本。虽然您的案例非常具体,但我更喜欢通过查看照片的EXIF信息将照片发送到单独的文件夹。它将照片从SRC复制到DST,并在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)
导入EXIF、os、re、shutil、sys __日期:“(2009年6月4日下午1:27:16$” 如果名称=“\uuuuu main\uuuuuuuu”: 如果len(sys.argv)<3: 打印“未提供参数.PhotoDispatcher.py” 出口(1) src=sys.argv[1] dst=sys.argv[2] 对于os.walk(src)中的路径、目录和文件: 对于文件中的文件名: curfile=src+'/'+文件名 f=打开(curfile,'rb'); tags=EXIF.process\u文件(f,stop\u tag='EXIF DateTimeOriginal') f、 关闭() try:dateTimeOrig=tags['EXIF DateTimeOriginal'].\uuuu str\uuuu()[0:10] 除KeyError外: 打印“无法读取DateTimeOriginal标记”,文件名 持续 dirName=re.sub(“:”,“.”,dateTimeOrig) newdir=dst+'/'+dirName try:os.mkdir(newdir) 除操作系统错误外: 打印“无法创建目录:”,操作系统错误 newfile=newdir+'/'+文件名 打印当前文件“-->”,新文件 move(curfile,newfile) 试试这个

find ./Artists/ -name "?" -maxdepth 1 -mindepth 1 -exec mv {} ./Artists/ \;
传递find的输出会丢失文件名中空格和单独文件之间的区别-exec将对每个找到的文件执行mv,一次一个-ok会做同样的事情,但会先要求您确认

试试这个

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

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

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

#!/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
这对于我的简单测试用例来说非常有效;为了确保它适合您,请在三条操作线前面放置一个
回音
mv
,两次
rmdir


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

对于第二个请求,请尝试以下方法:

#!/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
这对于我的简单测试用例来说非常有效;为了确保它适合您,请在三条操作线前面放置一个
回音
mv
,两次
rmdir


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

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

尝试以下方法:

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

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

尝试以下方法:

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