Shell-Script

我可以使用什麼腳本語言來自動化連接和壓縮過程?

  • April 17, 2013

對於我正在做的一個項目,我需要連接和壓縮(使用 zip)許多(midi)文件並比較它們的大小。我認為一定有某種語言可以讓我做這樣的事情:

  1. 創建所有成對連接(即我需要合併文件 01.mid 和 02.mid 並創建文件 0102.*,我不在乎它是否是有效的 midi 文件,我只希望它具有兩者的資訊.tar 是一個不錯的選擇嗎?)
  2. 獨立壓縮所有文件(原始和連接)
  3. 檢查所有文件大小並將它們寫在一些表中,然後我可以用 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在處理時將名稱連接到。

引用自:https://unix.stackexchange.com/questions/72619