我可以使用什么脚本语言来自动执行串联和压缩过程?

我可以使用什么脚本语言来自动执行串联和压缩过程?

对于我正在做的一个项目,我需要连接和压缩(使用 zip)许多(midi)文件并比较它们的大小。我认为一定有某种语言允许我做这样的事情:

  1. 创建所有成对串联(即我需要合并文件 01.mid 和 02.mid 并创建文件 0102.*,我不关心它是否是有效的 midi 文件,我只希望它具有两个文件的信息.tar 是一个好的选择吗?)

  2. 独立压缩所有文件(原始文件和串联文件)

  3. 检查所有文件大小并将它们写入某个表中,然后我可以使用 Matlab 或其他工具导入该表

我应该使用 bash 脚本吗?

答案1

您可以使用 bash 脚本,但对于压缩等,它依赖于其他程序。您可能更适合使用 Python 或任何其他可以为您生成 CSV 文件的脚本语言(尽管 CSV 语法不一定难以生成),并且可以进行串联和压缩。

给定这个文件目录(长度不同,但填充相同的字符):

-rw-rw-r-- 1 anthon users   24 Apr 16 15:03 01.mid
-rw-rw-r-- 1 anthon users  254 Apr 16 15:03 02.mid
-rw-rw-r-- 1 anthon users  455 Apr 16 15:03 03.mid
-rw-rw-r-- 1 anthon users   98 Apr 16 15:03 04.mid
-rw-rw-r-- 1 anthon users  444 Apr 16 15:03 05.mid
-rw-rw-r-- 1 anthon users  239 Apr 16 15:03 06.mid
-rw-rw-r-- 1 anthon users  257 Apr 16 15:03 07.mid
-rw-rw-r-- 1 anthon users  128 Apr 16 15:03 08.mid
-rw-rw-r-- 1 anthon users  228 Apr 16 15:03 09.mid
-rw-rw-r-- 1 anthon users  160 Apr 16 15:03 10.mid

和这个程序test.py

#! /usr/bin/env python
# coding: utf-8

import sys
import os
import csv
import bz2

comb_name_map = {}
file_names = []
prev_name = None

# combine the names
for name in sys.argv[1:]:
    if prev_name:
        basename, ext = os.path.splitext(name)
        basename = os.path.basename(basename)
        combi_name = os.path.splitext(os.path.basename(prev_name))[0] + name
        comb_name_map[combi_name] = (prev_name, name)
        prev_name = None
    else:
        prev_name = name

for combi, org in comb_name_map.iteritems():
    file_names.append(combi + '.bz2')
    with bz2.BZ2File(file_names[-1], 'w') as outf:
        for name in org:
            with open(name, 'rb') as inf:
                buf = inf.read()
                outf.write(buf)
                file_names.append(name + '.bz2')
                with bz2.BZ2File(file_names[-1], 'w') as compf:
                    compf.write(buf)

with open('filesizes.csv', 'w') as fp:
    csvf = csv.writer(fp)
    for name in file_names:
        size = os.path.getsize(name)
        csvf.writerow([name, size])

运行为:

python test.py *.mid

您将得到以下输出文件:

-rw-rw-r-- 1 anthon users 45 Apr 16 15:26 0102.mid.bz2
-rw-rw-r-- 1 anthon users 39 Apr 16 15:26 01.mid.bz2
-rw-rw-r-- 1 anthon users 39 Apr 16 15:26 02.mid.bz2
-rw-rw-r-- 1 anthon users 45 Apr 16 15:26 0304.mid.bz2
-rw-rw-r-- 1 anthon users 43 Apr 16 15:26 03.mid.bz2
-rw-rw-r-- 1 anthon users 39 Apr 16 15:26 04.mid.bz2
-rw-rw-r-- 1 anthon users 44 Apr 16 15:26 0506.mid.bz2
-rw-rw-r-- 1 anthon users 43 Apr 16 15:26 05.mid.bz2
-rw-rw-r-- 1 anthon users 39 Apr 16 15:26 06.mid.bz2
-rw-rw-r-- 1 anthon users 41 Apr 16 15:26 0708.mid.bz2
-rw-rw-r-- 1 anthon users 39 Apr 16 15:26 07.mid.bz2
-rw-rw-r-- 1 anthon users 37 Apr 16 15:26 08.mid.bz2
-rw-rw-r-- 1 anthon users 43 Apr 16 15:26 0910.mid.bz2
-rw-rw-r-- 1 anthon users 39 Apr 16 15:26 09.mid.bz2
-rw-rw-r-- 1 anthon users 39 Apr 16 15:26 10.mid.bz2

和一个文件filesizes.csv

0910.mid.bz2,43
09.mid.bz2,39
10.mid.bz2,39
0708.mid.bz2,41
07.mid.bz2,39
08.mid.bz2,37
0304.mid.bz2,45
03.mid.bz2,43
04.mid.bz2,39
0506.mid.bz2,44
05.mid.bz2,43
06.mid.bz2,39
0102.mid.bz2,45
01.mid.bz2,39
02.mid.bz2,39

确保您有偶数个.mid文件。要包含原始文件名和大小,只需file_names在处理时将名称连接到即可。

答案2

是的——bash脚本就能满足要求。但您应该使用您熟悉的任何脚本语言。 python、perl 是其他可能性。

相关内容