시작하면 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
: ) 의 출력을 확인하면 md5sum
s는 디렉토리와 심볼릭 링크 모두에 대해 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
(예: )로 시작하고 일반 파일의 경우 심볼릭 링크의 경우 (예: )로 시작하는 것으로 보이 므로 대신 사용할 수 있습니다. 예를 들어, 목차를 인쇄하려면:040755
012
0120777
010
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 bsdtar
및 bsdcpio
많은 그래픽 아카이브 추출기에서 지원되므로 이를 사용하여 RPM을 즉시 형식으로 변환하고 해당 옵션을 사용하여 bsdtar
유형별 로 아카이브 구성원을 필터링할 수 있습니다 .tar
star
-find
bsdtar cf - @file.rpm | star tf - -find ! -type d
d
디렉터리 유형의 파일을 제외 하거나 포함만 하는 -type f
대신! -type f
정기적인디렉터리, 심볼릭 링크, 장치, fifo 등을 포함한 다른 모든 유형의 파일을 제외한 파일
또는 GNU는 목록의 디렉터리 끝에 tar
a를 추가하므로 RPM의 경로에 개행 문자가 있는 멤버가 없다고 보장할 수 있는 경우:/
bsdtar cf - @file.rpm | tar tf - | grep -v '/$'