다음을 사용하여 암호화된 파일의 포함된 파일 이름을 볼 수 있습니다 gpg --list-packets 001.gpg
.
[...]
:literal data packet:
mode b (62), created 1630584912, name="elephant.jpg",
raw data: 87417 bytes
[...]
포함된 파일 이름만 가져오는 방법이 있습니까? 표시 전용 명령이 있나요 elephant.jpg
?
답변1
name="
",
행 사이 및 행 이후의 데이터를 얻으려면 :literal data packet:
다음을 사용하십시오 sed
.
gpg --list-packets file.gpg |
sed -e '/^:literal data packet:$/!d' \
-e 'N' \
-e 's/[^=]*name="//' \
-e 's/",$//' \
-e 'q'
표현식은 먼저 행을 찾을 때까지 sed
읽은 모든 행을 삭제합니다 . 그런 다음 즉시 다음 줄을 추가하고 첫 번째 하위 문자열을 포함하여 현재 버퍼의 모든 내용을 삭제합니다. 그런 다음 줄 끝에서 제거하고 종료합니다(출력 버퍼에 남은 것).gpg
:literal data packet:
N
name="
",
이를 통해 데이터에 포함된 유사한 데이터 file",
나 파일 이름 으로 작업할 수 있습니다 .name="hello"
gpg
특수 문자는 파일에 포함되기 전에 16진수 이스케이프 시퀀스로 인코딩됩니다 gpg
. 예를 들어, 각 개행 문자는 \x0a
.
답변2
sed
이 패턴을 사용하여 파일 이름을 추출 할 수 있습니다 .
$ text='
[...]
:literal data packet:
mode b (62), created 1630584912, name="elephant.jpg",
raw data: 87417 bytes
[...]
'
$ echo "$text" | sed -n 's/.*name="\(.*\)",/\1/p'
elephant.jpg
$
답변3
한 가지 방법은 gpg 라이브러리를 사용하고 CLI 유틸리티와 동일한 작업을 수행하는 것입니다.
그렇지 않으면 gpg 출력을 필터링할 수 있습니다.
#!/bin/bash
if [ -z "$1" ]; then
echo "No filename specified" 1>&2
exit 1
fi
if [ ! -r "$1" ]; then
echo "File not found" 1>&2
exit 2
fi
gpg --list-packets "$1" \
| grep ", name=" | cut -f2 -d '"'
(이는 포함된 이름에 큰따옴표가 포함되어 있지 않다고 가정합니다.)
답변4
짧은 버전:
gpg --list-packets file.gpg | awk -F\" '/created/ {print $2}'