2012-06-12 52 views
9

Để tôi mô tả tình hình đầu tiên của mình, tôi đang làm việc trên nền tảng Linux và có một tập hợp các tệp .bmp thêm một số vào số ảnh từ filename0022.bmp lên đến filename0680.bmp. Vì vậy, tổng cộng 658 hình ảnh. Tôi muốn có thể chạy từng bức ảnh này thông qua một tập tin .exe hoạt động trên bức ảnh, sau đó khởi động tập tin vào một tập tin được chỉ định bởi người sử dụng, nó cũng có một số đối số ngưỡng: thấp hơn, trên. Vì vậy, cuộc gọi thông thường cho thực thi là:Làm thế nào để lặp lại một lệnh thực thi trong terminal trong Linux?

./filter inputfile outputfile lower upper 

Có cách nào để tôi có thể lặp lại cuộc gọi này trên tất cả các tệp chỉ từ thiết bị đầu cuối hoặc bằng cách tạo một số loại tập lệnh bash? Vấn đề của tôi tương tự như sau: Execute a command over multiple files with a batch file nhưng lần này tôi đang làm việc trong một thiết bị đầu cuối dòng lệnh Linux.

Trả lời

6

Bạn có thể thử một cái gì đó như thế này ...

#! /bin/bash 
for ((a=022; a <= 658 ; a++)) 
do 
    printf "./filter filename%04d.bmp outputfile lower upper" $a | "sh" 
done 
+1

đây là những gì tôi đã thử và nó in một loạt những thứ liên quan đến màn hình của tôi nhưng không thực sự tạo ra bất kỳ tập tin ... #!/bin/bash cho ((a = 022; a <= 680; a ++)) do printf "./filter fetus-00-2.3.5um__voi0% 04d.bmp fetus_threshold_% 04d 90 240" $ a hoàn thành trong đó 90 và 240 là các đối số dưới và trên tôi đã đề cập trước đó. Tôi đã không thực hiện một kịch bản bash vì vậy tôi chỉ sử dụng emacs để tạo ra một tập tin mà tôi đã gõ các dòng mã trước đó. Sau đó tôi đã lưu tập tin emacs chỉ đơn giản là thử nghiệm. không có gì đằng sau nó vì đó là những gì tôi thấy một vài ví dụ làm trực tuyến. Bạn có thêm mẹo nào không? –

+0

thử làm cho nó thành một tập tin .sh (với bổ sung mới tôi đã thực hiện ở trên) và sau đó chạy các tập tin bằng cách gõ [[bash myfile.sh]] trong cùng một thư mục – scottyaz

+0

Vâng, tin tốt ... ít nhất là lặp lại điều này thời gian xung quanh và thậm chí nó hoạt động trên hình ảnh đầu tiên, sau đó tôi nhận được một số lỗi đến từ phần mềm mà tệp thực thi đang sử dụng. Điều tôi không hiểu là nó đang cố gắng để bắt đầu tại inputfile0000 và chúng tôi nói với nó để bắt đầu với inputfile0022.bmp. Hình ảnh đầu ra duy nhất tôi nhận được là outputfile0000.bmp. Đây là tệp bash tôi đã lưu dưới dạng ngưỡng.sh: #!/bin/bash cho ((a = 022; a <= 680; a ++)) do printf "./filter6 fetus-00-2_3.5um__rec_voi% 04d.bmp fetus_threshold_% 04d.bmp 90 240" $ a | "sh" done –

1

Bạn có thể kiểm tra rằng AS-IS trong vỏ của bạn:

for i in *; do 
    echo "$i" | tr '[:lower:]' '[:upper:]' 
done 

Nếu bạn có một con đường đặc biệt, thay đổi * bởi con đường của bạn + một glob: Ex:

for i in /home/me/*.exe; do ... 

Xem http://mywiki.wooledge.org/glob

+0

giả sử ông đang ở trong thư mục bên phải: =) – ant

+1

Edited để giải thích khả năng này =) –

+0

hey sputnick, Ông có thể giúp tôi hiểu được chút mã bạn đã viết ở trên? Tôi có thể nhìn thấy bạn có một vòng lặp cho đi qua tất cả mọi thứ nhưng không nhìn thấy nơi bạn đã bao giờ gọi thực thi để xử lý hình ảnh. Bạn có thể cho tôi thêm một chút chi tiết và giải thích không? Cảm ơn sự giúp đỡ và bài viết của bạn. Thật tuyệt vời khi nhận được nhiều trợ giúp này trong một thời gian ngắn như vậy. –

0

Điều này trong khi thêm tên của hình ảnh đầu ra như filtered_filename0055.bmp

for i in *; do 
    ./filter $i filtered_$i lower upper 
done 
+0

Thao tác này sẽ ghi đè lên tệp nguồn mà tôi đoán. –

+0

Điều gì sẽ xảy ra nếu một tệp có không gian trong đó? Sau đó lệnh sẽ giải quyết thành './filter file withspace filter_file withspace lower upper'. Có lẽ bạn nên báo giá '" $ i "' khi bạn sử dụng nó. –

+1

@TimPote Chỉ cần cố gắng để làm cho nó đơn giản nhất có thể dựa trên thông tin câu hỏi., Nhưng có dấu ngoặc kép sẽ làm cho nó tốt hơn cũng một số kiểm tra cho phần mở rộng tập tin và thư mục. –

11

Bạn có thể quan tâm đến việc tìm kiếm vào bash scripting.

Bạn có thể thực thi lệnh trong vòng lặp for trực tiếp từ trình bao.

Một vòng lặp đơn giản để tạo ra các con số mà bạn đã đề cập cụ thể. Ví dụ, từ vỏ:

[email protected] $ for i in {22..680} ; do 
> echo "filename${i}.bmp" 
> done 

này sẽ cung cấp cho bạn một danh sách filename22.bmp-filename680.bmp. Điều đó chỉ đơn giản là xử lý sự lặp lại của phạm vi mà bạn đã đề cập. Điều này không bao gồm số không đệm. Để thực hiện việc này, bạn có thể sử dụng printf. Cú pháp printfprintf format argument. Chúng ta có thể sử dụng biến số $i từ vòng lặp trước của chúng ta làm đối số và áp dụng định dạng %Wd trong đó W là chiều rộng. Tiền tố của trình giữ chỗ W sẽ chỉ định ký tự cần sử dụng. Ví dụ:

[email protected] $ for i in {22..680} ; do 
> echo "filename$(printf '%04d' $i).bmp" 
> done 

Ở trên $() hoạt động như một biến, thực thi lệnh để lấy giá trị trái ngược với giá trị được xác định trước.

Điều này sẽ cung cấp cho bạn các tên tệp bạn đã chỉ định. Chúng ta có thể lấy đó và áp dụng nó cho các ứng dụng thực tế:

[email protected] $ for i in {22..680} ; do 
> ./filter "filename$(printf '%04d' $i).bmp" lower upper 
> done 

Điều này có thể được viết lại để tạo thành một dòng:

[email protected] $ for i in {22..680} ; do ./filter "filename$(printf '%04d' $i).bmp" lower upper ; done 

Một điều cần lưu ý từ câu hỏi, các file .exe thường biên soạn trong COFF định dạng trong đó linux mong đợi một định dạng thực thi ELF.

+0

'user @ machine $ 'là để mô phỏng một dấu nhắc trình bao,'> 'mô phỏng sự tiếp tục dấu nhắc mong đợi nhiều hơn trước khi hoàn thành lệnh để thực thi. –

7

đây là một ví dụ đơn giản:

for i in {1..100}; do echo "Hello Linux Terminal"; done 

để nối thêm vào một tập tin: (>> được sử dụng để nối thêm, bạn cũng có thể sử dụng> để ghi đè lên)

for i in {1..100}; do echo "Hello Linux Terminal" >> file.txt; done 
1

Bạn có thể tận dụng xargs để lặp lại:

ls | xargs -i ./filter {} {}_out lower upper 

Lưu ý:

  • {} tương ứng với một đầu ra dòng từ đường ống, dưới đây là tên inputfile.
  • Tệp đầu ra sẽ được đặt tên với postfix '_out'.
Các vấn đề liên quan