2012-06-25 27 views
16

Tôi cần xử lý một số lượng tệp lớn trong một thư mục. Các tập tin có thể được phân chia thành nhiều nhóm, dựa trên tên tập tin. Tức là, tên tệp có thể là mẫu phù hợp với 'nhóm' mà chúng thuộc về. Ví dụ, tên là như thế này:Tập lệnh Bash để lặp lại các tệp trong tên tệp đối sánh thư mục và mẫu

  • YYYYMMDD _ * _ bulk_import.csv
  • YYYYMMDD _ * _ genstats_import.csv
  • YYYYMMDD_ * allstats.csv

vv ...

Mỗi 'nhóm' có một phương pháp xử lý khác nhau (tức là một lệnh khác được gọi để xử lý).

Tôi muốn viết một kịch bản bash để:

  1. Duyệt qua tất cả các file CSV trong thư mục
  2. Xác định 'nhóm' một tập tin thuộc về bởi mô hình phù hợp với tên gọi của nó để mô hình được biết đến (như ví dụ tôi đã nêu ở trên)
  3. Gọi một lệnh dựa trên nhóm được xác định.

Tôi đang chạy trên Ubuntu 10.0.4. Tôi mới bắt đầu, và sẽ đánh giá cao đoạn mã xương sẽ giúp tôi bắt đầu viết kịch bản này.

Trả lời

34

Cách dễ nhất có lẽ chỉ là lặp lại từng nhóm một cách riêng biệt. Điều này hoàn toàn phụ thuộc vào vấn đề phân tích cú pháp.

DIRECTORY=. 

for i in $DIRECTORY/YYYYMMDD_*_bulk_import.csv; do 
    # Process $i 
done 

for i in $DIRECTORY/YYYYMMDD_*_genstats_import.csv; do 
    # Process $i 
done 

for i in $DIRECTORY/YYYYMMDD_*allstats.csv; do 
    # Process $i 
done 

Đặt DIRECTORY cho bất kỳ thư mục nào bạn muốn tìm kiếm. Mặc định . sẽ tìm kiếm thư mục làm việc hiện tại.

+0

Tốt và đơn giản. Nhận phiếu bầu của tôi! –

+0

Sẽ có một cách đơn giản để có được "giá trị" của '*' trong vòng lặp? – luckydonald

6

Đây là lần lặp cơ bản trên tệp, với khối chuyển đổi để xác định loại tệp.

#!/bin/bash 
for f in *; do 
     case $f in 
       [0-9]*_bulk_import.csv) 
         echo $f case 1 
         ;; 
       [0-9]*_genstats_import.csv) 
         echo $f case 2 
         ;; 
       [0-9]*allstats.csv) 
         echo $f case 3 
         ;; 
     esac 
done 
Các vấn đề liên quan