rpm 패키지의 파일만 나열

rpm 패키지의 파일만 나열

시작하면 rpm -ql <somerpm>rpm 패키지에 포함된 파일과 디렉터리가 나열됩니다. 엄밀히 말하면 디렉터리가 아닌 파일만 나열하고 싶습니다.

rpm -ql <somerpm>각 출력이 디렉터리인지 여부를 개별적으로 확인하는 데 의존하지 않는 플래그나 명령이 있습니까 (예: [ -d $line ]각 줄의 셸에서 테스트 수행)?

답변1

rpm파일 목록 출력에서 ​​디렉터리를 억제하는 기본 제공 옵션이 없는 것 같습니다 .

그러나 --queryformat(없이) 옵션을 사용하여 -l각 파일의 파일 모드와 파일 이름을 인쇄한 다음 출력을 파이프하여 grep모드 필드가 다음으로 시작하는 항목을 제외 할 수 있습니다 d.

rpm -q --qf '[%{FILEMODES:perms} %{FILENAMES}\n]' some_rpm | grep -v '^d'

그러면 실제 파일 항목에 대한 모드 필드가 계속 인쇄됩니다. 이를 억제하려면 약간 더 복잡한 절차를 사용할 수 있습니다 sed.

rpm -q --qf '[%{FILEMODES:perms} %{FILENAMES}\n]' some_rpm | sed -nE '/^[^d]/s/.* //p'

기본적으로 이는 출력을 억제하고 이 작업을 수행하는 행만 고려합니다.아니요d첫 번째 열 부터 시작 하고 삭제합니다.


이전 버전의 답변

ls -l그러나 자세한 출력이 파일의 스타일 목록을 인쇄 하고 출력을 파이프하여 grep권한 필드가 다음으로 시작하는 항목을 제외한다는 사실을 활용할 수 있습니다 d.

rpm -ql -v some_rpm | grep -v '^d' 

이렇게 해도 여전히 "전체" 출력 스타일이 유지됩니다. 출력을 실제 파일 이름으로 제한하려면 awk실제 파일 이름인 마지막 열만 인쇄하는 약간 더 복잡한 프로그램으로 출력을 파이프할 수 있습니다. 파일이 ->끝에서 두 번째 열로 식별되는 심볼릭 링크인지 확인하는 검사를 포함시켰습니다. 이 경우 링크 대상 대신 링크 이름이 인쇄됩니다.

rpm -ql -v some_rpm | awk '$1 !~ /^d/ {if ($(NF-1) != "->") {print $NF;} else {print $(NF-2)}}'

그러나 이것은 우연히 발견 될 것입니다파일 이름에 공백이 포함되어 있습니다., 그러니 여기서 조심해야 합니다.

답변2

출력을 제한하는 몇 가지 옵션이 있습니다.

-c, --configfiles
  List only configuration files (implies -l).

-d, --docfiles
  List only documentation files (implies -l).

하지만 파일 중 어느 것도 (그리고오직문서) 내가 볼 수 있는 것에서. 그래서, 다음과 같은 것관리자 꿀벌의 답변, 출력을 처리하는 것이 좋지만 다음 --dump옵션을 사용하는 것이 좋습니다.

--dump  Dump file information as follows:

   path size mtime md5sum mode owner group isconfig isdoc rdev symlink

This option must be used with at least one of -l, -c, -d.

예제 패키지(예 bash: ) 의 출력을 확인하면 md5sums는 디렉토리와 심볼릭 링크 모두에 대해 0이지만 마지막 열은 항목이 심볼릭 링크가 아닌 경우입니다 X. 그래서:

  • 목차만 인쇄:

    rpm -q -l --dump package | awk '$4 ~ /^0+$/ && $NF == "X" {print $1}'
    
  • 심볼릭 링크만 인쇄:

    rpm -q -l --dump package | awk '$4 ~ /^0+$/ && $NF != "X" {print $1}'
    
  • 파일을 인쇄하세요.

    rpm -q -l --dump package | awk '$4 !~ /^0+$/ && $NF == "X" {print $1}'
    

Amazon Linux 2023 Docker 이미지의 출력 예:

$ rpm -q bash -l --dump | awk '$4 !~ /^0+$/ && $NF == "X" {print $1}' | head # Limiting output for regular files
/etc/skel/.bash_logout
/etc/skel/.bash_profile
/etc/skel/.bashrc
/usr/bin/alias
/usr/bin/bash
/usr/bin/bashbug-64
/usr/bin/bg
/usr/bin/cd
/usr/bin/command
/usr/bin/fc

$ rpm -q bash -l --dump | awk '$4 ~ /^0+$/ && $NF != "X" {print $1}'  # Symlinks
/usr/bin/bashbug
/usr/bin/sh
/usr/lib/.build-id/f2/caf7678bcb7e7d116f91109985f2f0209e714b
/usr/share/man/man1/bashbug-64.1.gz
/usr/share/man/man1/sh.1.gz

$ rpm -q bash -l --dump | awk '$4 ~ /^0+$/ && $NF == "X" {print $1}' # directories
/usr/lib/.build-id
/usr/lib/.build-id/f2
/usr/share/doc/bash
/usr/share/licenses/bash

다시 살펴보면 그것도 mode작동합니다. 패턴은 디렉토리의 경우 04(예: )로 시작하고 일반 파일의 경우 심볼릭 링크의 경우 (예: )로 시작하는 것으로 보이 므로 대신 사용할 수 있습니다. 예를 들어, 목차를 인쇄하려면:0407550120120777010

rpm -q -l --dump package | awk '$(NF - 6) ~ /^04/ {print $1}'

또는 파일 나열:

rpm -q -l --dump package | awk '$(NF - 6) ~ /^010/ {print $1}'

답변3

RPM 파일은 libarchive bsdtarbsdcpio많은 그래픽 아카이브 추출기에서 지원되므로 이를 사용하여 RPM을 즉시 형식으로 변환하고 해당 옵션을 사용하여 bsdtar유형별 로 아카이브 구성원을 필터링할 수 있습니다 .tarstar-find

bsdtar cf - @file.rpm | star tf - -find ! -type d

d디렉터리 유형의 파일을 제외 하거나 포함만 하는 -type f대신! -type f정기적인디렉터리, 심볼릭 링크, 장치, fifo 등을 포함한 다른 모든 유형의 파일을 제외한 파일

또는 GNU는 목록의 디렉터리 끝에 tara를 추가하므로 RPM의 경로에 개행 문자가 있는 멤버가 없다고 보장할 수 있는 경우:/

bsdtar cf - @file.rpm | tar tf - | grep -v '/$'

관련 정보