Liệt kê các phụ thuộc tùy chọn với pacman trên arch linux


23

Tôi đang sử dụng linux linux.

Có cách nào để liệt kê các phụ thuộc tùy chọn của tất cả các gói được cài đặt không? Và nếu có, tôi có thể lọc danh sách này để chỉ xem các gói bị thiếu (chưa cài đặt) không?


1
Tôi chưa sử dụng Arch, nhưng "sự phụ thuộc" không có vẻ tùy chọn (nó không có trong các bản phát hành khác).
jordanm

AFAIK, tôi không nghĩ rằng bạn có thể làm điều đó với pacman ngay lập tức. Nhưng nó là rất có thể để viết một kịch bản nhỏ để làm điều đó. Truy vấn pacman cho danh sách các gói được cài đặt. Yêu cầu Yaourt lấy PKGBUILD của họ và đọc danh sách các optdeps. Phiên bản mới nhất của pacman-git có một cam kết cho biết liệu optdeps đã được cài đặt chưa.
darnir

@jordanm: Như đã xây dựng các phụ thuộc và các phụ thuộc tùy chọn. Optdeps chỉ được yêu cầu cho một số tính năng nhất định của gói. Vì vậy, trừ khi bạn đang sử dụng tính năng đó, bạn không thực sự cần phải làm hỏng hệ thống của mình với vô số phụ thuộc.
darnir

Tôi đã sử dụngpacman -Qi | grep "Optional Deps" | grep -v None | grep -v installed
stewSquared

Câu trả lời:


5

Bạn có thể sử dụng expac để truy vấn pacmancơ sở dữ liệu.

Cái gì đó như:

awk 'NF>=2' <(expac "%n %O") > optdeps

sẽ in danh sách tất cả các gói đã cài đặt trên máy của bạn và optdependscho từng gói ( %O) 1 vào một tệp được gọi optdeps. Sau đó, bạn có thể sắp xếp thứ này theo danh sách các gói optdepends đã cài đặt.

Xem man expacđể biết danh sách đầy đủ các tùy chọn.


1. Đó là chữ hoa O, không phải số không. Bởi vì chúng ta không thể có một phông chữ phân biệt giữa hai ...


[poke] Bây giờ chúng ta có một phông chữ như vậy. :)
muru

4

Có một tiện ích tốt đẹp trong Kho lưu trữ AUR (aur / pacdep).

pacdep có rất nhiều tùy chọn - chỉ một ví dụ - tìm ra các gói tùy chọn cho "thunar-archive-plugin":

> pacdep -oppp thunar-archive-plugin
[...]
Optional dependencies:    6.16 MiB
  extra/file-roller     3.89 MiB
  extra/kdeutils-ark    1.12 MiB
  community/xarchiver   1.16 MiB
[...]

Đầu ra ở trên có nghĩa là không có gói tùy chọn nào được cài đặt. Sau khi cài đặt "xarchiver", đầu ra trông như

[...]
Optional dependencies:    6.16 MiB
 local:    1.16 MiB
  xarchiver            1.16 MiB
 sync:     5.01 MiB
  extra/file-roller    3.89 MiB
  extra/kdeutils-ark   1.12 MiB
[...]

Tôi đã tìm thấy (phần đầu tiên) câu trả lời này trên
http://mywaytoarch.tumblr.com/post/34979742718/easily-list-package-dependencies


3

Điều này không chính xác hiệu quả, nhưng sẽ tìm thấy những gì bạn muốn (trong MÀU!):

pacman -Q > /tmp/paccache
for pkg in $(awk '{print $1}' /tmp/paccache) ; do 
   echo -n "$pkg => "; 
   for dep in $(pacman -Qi $pkg | awk -F: '/Optional Deps/{gsub(/[\<\>=].*/,"");print $NF;}' ) ; do 
       grep -q "$dep" /tmp/paccache && COLOR=32 ; echo -en "\e[1;${COLOR:-31}m${dep}\e[0;m " ; unset COLOR ; 
   done 
   echo
done 

Tôi không hoàn toàn chắc chắn, nhưng không nên ||thay vì &&sau grep, và sau đó là dấu ngoặc đơn xung quanh phần còn lại của dòng?
Rörd

Và quan trọng hơn, điều này có lẽ nên sử dụng phần "Tùy chọn phụ thuộc" thay vì phần "Phụ thuộc vào" của đầu ra pacman.
Rörd

Ví dụ với xmms2 :pacman -Qi xmms2 | sed -n '/^Optional/,$p' | sed '/^Required/q' | head -n -1 | cut -c19- | cut -d: -f1
i336_

2

Mặc dù tôi đã phải chú ý rằng giải pháp của @ DarkHeart không thực sự hiệu quả, nhưng nó đã truyền cảm hứng cho tôi để tạo ra một giải pháp hiệu quả. (mặc dù không có màu)

Tôi đang sử dụng truy vấn gói , một công cụ tương tự thay vì expac được đề xuất bởi @jasonwryan, vì tôi đã cài đặt nó (đó là một phụ thuộc của yaourt). Thay vào đó, việc thay đổi điều này là sử dụng expac.

Việc liệt kê tất cả các phụ thuộc tùy chọn hầu hết được thực hiện bằng lệnh gọi truy vấn gói. Vòng lặp for đầu tiên loại bỏ các giải thích, do đó, chỉ các tên gói cho các phụ thuộc tùy chọn vẫn còn; vòng lặp thứ hai loại bỏ các phụ thuộc đã được cài đặt trong dòng đầu tiên của nó trước khi in kết quả trong dòng thứ hai.

#!/usr/bin/perl
use strict;
use warnings;

my %deps;
for (`package-query -Q -f'%n %O'`) {
    $deps{ (/^(\S+)/)[0] } = [/(\S+):/g];
}
my @pkgs = keys %deps;
for my $pkg (@pkgs) {
    my @missing_deps = grep { !($_ ~~ @pkgs) } @{ $deps{$pkg} };
    print "$pkg => @missing_deps\n" if @missing_deps;
}

2

Cái này cần phải dùng mẹo:

comm -23 <(expac -l"\n" "%o" | sort -u) <(expac -l"\n" "%n\n%S" | sort -u)

Đầu vào đầu tiên để commliệt kê tất cả các phụ thuộc tùy chọn, đầu vào thứ hai tất cả các gói được cài đặt và thuộc tính 'cung cấp' của chúng. Cả hai danh sách được sắp xếp và chứa mỗi phần tử chỉ một lần do sort -u. Sau đó, chỉ các dòng được hiển thị được chứa trong danh sách đầu tiên nhưng không có trong danh sách thứ hai.

(được chỉnh sửa để kết hợp với đề xuất của @ Archemar)


0

Đôi khi bạn phải làm việc ngược ... trước tiên hãy tìm tất cả các tùy chọn không tùy chọn, sau đó tham chiếu chéo với danh sách đầy đủ, sau đó sử dụng uniq. Điều này sẽ tạo ra một danh sách tùy chọn cài đặt tùy thuộc.

Tìm tất cả cài đặt

pacman -Q

Tìm tất cả không tùy chọn:

pacman -Qent

Do đó, các mục duy nhất phải là tùy chọn:

(pacman -Q; pacman -Qent) | sort | uniq -u 

Tạo danh sách thiếu tùy chọn phụ thuộc vào mô tả, không đẹp, nhưng nó hoạt động.

pacman -Q > /tmp/paccache; for pkg in $(awk '{print $1}' /tmp/paccache); do pacman -Qi $pkg | grep "^Optional Deps" | grep -v None >/dev/null && echo $pkg >> /tmp/hasdeps; done

for pkg in $(awk '{print $1}' /tmp/hasdeps); do echo -ne "Package: $pkg ___ "; (pacman -Qi $pkg | sed -n '/^Optional/,$p' | sed '/^Required/q' | head -n -1) | grep -v installed; echo ___; done | grep -v "___ ___" | sed -e 's/Optional Deps/ /' -e 's/___//' | sed -e 's/ \+/ /g'

0

Tôi chỉ thử trong GNU sed nhưng

yay -Qi | sed -n '/Optional Deps/{:l s/.* \([a-zA-Z0-9.\-]\+\):.*/\1/p; n; /Required By/!bl}'

cái này hoạt động (Sử dụng sort / uniq như bạn muốn).

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.