Shell-Script
我可以使用什麼腳本語言來自動化連接和壓縮過程?
對於我正在做的一個項目,我需要連接和壓縮(使用 zip)許多(midi)文件並比較它們的大小。我認為一定有某種語言可以讓我做這樣的事情:
- 創建所有成對連接(即我需要合併文件 01.mid 和 02.mid 並創建文件 0102.*,我不在乎它是否是有效的 midi 文件,我只希望它具有兩者的資訊.tar 是一個不錯的選擇嗎?)
- 獨立壓縮所有文件(原始和連接)
- 檢查所有文件大小並將它們寫在一些表中,然後我可以用 Matlab 或其他東西導入
我應該使用 bash 腳本嗎?
您可以使用 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
在處理時將名稱連接到。