2009-12-06 47 views
11

Tôi có một tập lệnh tự động mà tôi muốn chạy trên một thư mục. Tôi muốn kịch bản để lấy từng tập tin trong thư mục và chạy lệnh shell của tôi trên đó. Automator được thiết lập để vượt qua đầu vào để stdin, nhưng tôi không nghĩ rằng tôi đang sử dụng stdin chính xác dưới đây, bạn có thể giúp đỡ xin vui lòng?Sử dụng Máy tự động của Apple để chuyển tên tập tin vào tập lệnh shell

for f in "[email protected]" 
do 
    java -Xmx1000m -jar /Users/myprog/myprog.jar $f 
done 

Trả lời

9

Biến đặc biệt [email protected] đại diện cho tất cả các đối số dòng lệnh được cung cấp cho tập lệnh.

Vòng lặp for lặp lại từng bước và thực thi tệp jar mỗi lần. Bạn có thể rút ngắn tập lệnh thành:

for f 
do 
    java -Xmx1000m -jar /Users/myprog/myprog.jar "$f" 
done 

vì hành vi mặc định là for là sử dụng [email protected].

Bạn nên đặt dấu ngoặc kép quanh $ f ở cuối lệnh java trong trường hợp có khoảng trống trong đối số.

2

Tôi không chắc mình hiểu câu hỏi của bạn vì tập lệnh của bạn dường như không sử dụng stdin. Các [email protected] special parameter mở rộng đến các tham số vị trí được truyền dưới dạng đối số trong argv. Nó hoạt động theo cách tương tự như nếu bạn gọi là kịch bản trực tiếp từ vỏ theo cách này:

$ cat >test 
for f in "[email protected]" 
do 
    echo $f 
done 
$ chmod 755 test 
$ ./test a b c 
a 
b 
c 

Nếu bạn muốn để có được các đối số từ stdin, bạn thể làm điều gì đó như thế này:

$ cat >test2 
for f in $(cat) 
do 
    echo $f 
done 
$ chmod 755 test2 
$ ./test2 <<EOF 
> a b c 
> EOF 
a 
b 
c 
5

Dựa trên những gì tôi đã thấy ở đây, bạn có thể thiết lập "dịch vụ" tiện dụng cho phép bạn nhấp chuột phải và chuyển đổi tệp bằng menu ngữ cảnh trong công cụ tìm.

Để thiết lập:

  • Launch Automator
  • Từ menu chính chọn "New"
  • Chọn "Dịch vụ" (biểu tượng bánh răng)
  • Kéo và thả "Utilities -> Chạy Shell Script "từ thư viện bên trái vào vùng" trình soạn thảo "chính.
  • Thay thế văn bản "mèo" hiện có với đoạn mã sau:

    for f in "[email protected]"; do 
        /usr/bin/afconvert -f caff -d [email protected] -c 1 --mix "$f" 
        echo "$f converted" 
    done 
    

    LƯU Ý: Các thiết lập trên sẽ chuyển sang mono (-c 1 --mix) tại 16 bit @ 32000hz (LEI16 @ 32000 = chút cuối 16 bit). Sử dụng/usr/bin/afconvert -h trong terminal để xem tất cả các tùy chọn có sẵn.

  • Ở phía trên cùng của trình biên tập, bạn sẽ thấy hai trầm thả, để họ ra đi như sau:

    Service receives selected [Files and Folders] in [Finder.app] 
    
  • Trong lĩnh vực biên tập Shell Script, đảm bảo:

    "Shell" is set to "/bin/bash" 
    

    "pass input" is set to "arguments" 
    
  • Lưu thứ gì đó như "Chuyển thành CAF"

  • Điều hướng đến thư mục có một số WAV trong đó.
  • Nhấp chuột phải vào WAV và bạn sẽ thấy "Chuyển đổi sang CAF" ở cuối menu ngữ cảnh.
7

Bạn đúng khi bạn nói bạn "không sử dụng đúng chuẩn". Trong thực tế, từ đoạn mã script bạn đã cung cấp, tập lệnh của bạn giả định bạn đang nhận các tệp dưới dạng đối số trên dòng lệnh ... bạn không sử dụng stdin chút nào!

Ở góc trên cùng bên phải của hành động Run Shell Script, bên dưới X là hộp thả xuống có 2 tùy chọn: 'Nhập đầu vào: vào stdin' và 'Pass intput: as arguments'. Các tùy chọn này quyết định cách các tệp đã chọn được chuyển đến hành động tập lệnh của bạn. Nếu tùy chọn 'làm đối số' được chọn, tập lệnh của bạn nên sử dụng mẫu sau

for f in "[email protected]"; do 
# so stuff here 
done 

Mẫu này được cung cấp bởi chính hành động khi 'làm đối số' được chọn.

Mặt khác, nếu tùy chọn 'để stdin' được chọn, sau đó bạn nên sử dụng kịch bản tamplate này:

while read fname; do # read each line - assumes one file name per line 
    # do clever stuff with the filename 
    echo $fname # to illustrate we'll simply copy the filename to stdout 
done 

(Trong trường hợp bạn không biết bash kịch bản, tất cả mọi thứ sau khi # trên một đường thẳng là một bình luận)

Lưu ý rằng các mẫu được cung cấp bởi các hành động kịch bản là đơn giản, đơn lệnh

cat 

Không rất hữu ích trong quan điểm của tôi. Lưu ý rằng cho đến khi bạn thực sự nhập văn bản vào vùng tập lệnh, thay đổi giữa 'thành stdin' và 'làm đối số' sẽ thay đổi nội dung của hộp tập lệnh (tôi cho rằng đây là gợi ý cho kịch bản của bạn sẽ trông như thế nào) nhưng một khi bạn nhập một cái gì đó, việc chuyển đổi không còn xảy ra nữa.

Các vấn đề liên quan