私が作業しているプロジェクトでは、多くの(midi)ファイルをリンクして圧縮(zipを使用)し、サイズを比較する必要があります。私は次のことができる言語が必要だと思いました。
関連付けられているすべてのペアを作成します(たとえば、01.midファイルと02.midファイルをマージして0102.*ファイルを作成する必要があります。有効なmidiファイルであるかどうかにかかわらず、2つのファイルの情報しか持たないようにします。tarは良い選択ですか?
すべてのファイル(元のファイルと関連付けられたファイル)を独立して圧縮
すべてのファイルサイズを確認し、Matlabまたは他のツールを使用してインポートできるテーブルに書き込みます。
bashスクリプトを使用する必要がありますか?
答え1
Bashスクリプトを使用できますが、圧縮などの場合は他のプログラムに依存します。 CSVファイルを生成することができます(CSV構文が必ずしも生成するのは難しいわけではありませんが)、Pythonや他のスクリプト言語を使用して接続して圧縮できる方が良いかもしれません。
与えられたファイルディレクトリ(長さは異なるが同じ文字で埋められる):
-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は他の可能性があります。