apt-get gói cài đặt hàng loạt từ một tập tin?


36

Tôi có một tập tin văn bản với rất nhiều tên gói.

package1
package2

# comment
# installing package3 because it was needed for...
package 3

package 4

Làm cách nào tôi có thể cài đặt hàng loạt tất cả các gói bên trong tệp văn bản mà không xóa các nhận xét?


Giải pháp này cho phép bạn sử dụng các nhận xét: monolune.com/installing-apt-packages-from-a-requirements-file
Flux

Câu trả lời:


44

Một cái gì đó dọc theo những dòng này nên làm thủ thuật.

apt-get install $(grep -vE "^\s*#" filename  | tr "\n" " ")

Cấu trúc $ (một cái gì đó) chạy lệnh gì đó , chèn đầu ra của nó vào dòng lệnh.

Lệnh grep sẽ loại trừ bất kỳ dòng nào bắt đầu bằng #, tùy chọn cho phép khoảng trắng trước nó. Sau đó, lệnh tr thay thế dòng mới bằng dấu cách.


4
trsẽ thất bại với các chuỗi kết thúc nhiều byte (nghĩ \r\n), tại sao bạn không sử dụng xargs?
Ivan Anishchuk 17/2/2016

11

Lệnh sau đây là một cải tiến (nhẹ) so với thay thế vì sudo apt-get installkhông được thực thi khi danh sách gói trống.

xargs -a <(awk '! /^ *(#|$)/' "$packagelist") -r -- sudo apt-get install

Lưu ý rằng -atùy chọn đọc các mục trực tiếp từ một tệp thay vì đầu vào tiêu chuẩn. Chúng tôi không muốn chuyển một tập tin vào xargsvì stdin phải không thay đổi để sử dụng apt-get.


xargslà cách đúng đắn để làm điều này. Thủ thuật với <()là gọn gàng.
Ivan Anishchuk 17/2/2016

1
Đó thực sự là giải pháp tốt hơn bởi vì xargschắc chắn ARG_MAX không đạt được.
phk

Nó phải là xargs -a $(awk '/^\s*[^#]/' "$packagelist") -r -- sudo apt-get -y install, không phải " <(" mà là " $(" và tùy chọn -ycho apt-get sẽ là một ý tưởng tốt.

Quá trình thay thế chuyển hướng đầu ra của awkmột mô tả tập tin xargs -ađể đọc từ. Vì vậy, bạn chắc chắn muốn <(và không $(. Chỉ cần thử nó và bạn sẽ thấy những gì tôi có ý nghĩa. Nếu lệnh được chạy không giám sát và bạn đã biết chính xác những gì sẽ được cài đặt thì chắc chắn, -ycờ họ là một ý tưởng tốt.
Sáu

4

Đưa ra một tệp danh sách gói package.list, hãy thử:

sudo apt-get install $(awk '{print $1'} package.list)

0

Chà, đây là giải pháp của tôi để cài đặt danh sách các gói tôi có để cài đặt mới:

sudo apt install -y $(grep -o ^[^#][[:alnum:]-]* "filename")

Trong một bashchức năng:

aptif () {
    sudo apt install -y $(grep -o ^[^#][[:alnum:]-]* "$1")
}

grep giải trình :

  • -o chỉ giữ lại một phần của dòng khớp với biểu thức
  • ^[^#] bất cứ điều gì không bắt đầu với một #
  • [[:alnum]-]* một chuỗi các chữ cái, số và -
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.