2009-06-16 11 views
8

Tôi đã chia một tệp văn bản lớn thành một số nhóm nhỏ hơn để kiểm tra hiệu suất mà tôi đang thực hiện. Có một số thư mục như sau:Bash: cách duyệt qua cấu trúc thư mục và thực thi lệnh?

/home/brianly/output-02 (contains 2 files myfile.chunk.00 and myfile.chunk.01) 
/home/brianly/output-04 (contains 4 files...) 
/home/brianly/output-06 (contains 6 files...) 

Điều quan trọng cần lưu ý là ngày càng có nhiều tệp trong mỗi thư mục. Những gì tôi cần làm là chạy một tệp thực thi đối với từng tệp văn bản trong thư mục đầu ra. Lệnh trông giống như thế này đối với một tệp duy nhất:

./myexecutable -i /home/brianly/output-02/myfile.chunk.00 -o /home/brianly/output-02/myfile.chunk.00.processed 

Đây tham số -i là tệp đầu vào và tham số -o là vị trí đầu ra.

Trong C# Tôi lặp lại các thư mục có danh sách các tệp trong mỗi thư mục, sau đó lặp lại chúng để chạy các dòng lệnh. Làm thế nào để tôi đi qua một cấu trúc thư mục như thế này bằng cách sử dụng bash, và thực thi lệnh với các tham số chính xác dựa trên vị trí và các tệp ở vị trí đó?

Trả lời

8

Đối với loại điều tôi luôn luôn sử dụng tìm cùng với xargs:

$ find output-* -name "*.chunk.??" | xargs -I{} ./myexecutable -i {} -o {}.processed 

Bây giờ từ khi quy trình tập lệnh của bạn chỉ có một tập tin tại một thời điểm, sử dụng exec (hoặc -execdir) trực tiếp với tìm, như đã đề cập, là cũng giống như hiệu quả, nhưng tôi đang sử dụng để sử dụng xargs, vì đó là nói chung nhiều hơn nữa hiệu quả khi cho ăn một lệnh hoạt động trên nhiều đối số cùng một lúc. Vì vậy, nó là một công cụ rất hữu ích để giữ trong vành đai tiện ích của một người, vì vậy tôi nghĩ rằng nó nên được đề cập.

7

Cái gì như:

for x in `find /home/brianonly -type f` 
do 
./yourexecutable -i $x -o $x.processed 
done 
+0

có dấu tích trước khi tìm và sau f – nikudesu

+1

cho x bằng $ (find/home/brianonly -type f); làm ... được thực hiện $() là _so_ dễ đọc hơn nhiều so với bọ chét. $ 0,02 của tôi. –

+0

Tôi nghĩ rằng bạn sẽ cố xử lý các tệp đã xử lý. –

2

Như những người khác đã gợi ý, sử dụng find(1):

# Find all files named 'myfile.chunk.*' but NOT named 'myfile.chunk.*.processed' 
# under the directory tree rooted at base-directory, and execute a command on 
# them: 
find base-directory -name 'output.*' '!' -name 'output.*.processed' -exec ./myexecutable -i '{}' -o '{}'.processed ';' 
1

Từ thông tin được cung cấp, có vẻ như đây sẽ là bản dịch hoàn toàn đơn giản của ý tưởng C# của bạn.

for i in /home/brianly/output-*; do 
    for j in "$i/"*.[0-9][0-9]; do 
     ./myexecutable -i "$j" -o "$j.processed" 
    done 
done