在过去的几年里,我有不同类型的软件来组织我的照片和音乐收藏。这导致了目录结构的差异,我希望这是统一的。
问题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。
提前谢谢。
答案 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/