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