압축 파일의 최상위 디렉터리 이름을 가져오는 명령

압축 파일의 최상위 디렉터리 이름을 가져오는 명령

파일 이름은 다음과 같지만 디렉터리는 libgit2-0.21-1 입니다 tar xvf v0.21.1.tar.gz. 그런 다음 단일 라이너를 사용하여 디렉터리 이름을 가져오는 방법(디렉토리가 세 개 이상인 경우 오류가 보고됩니다):

tar tvf v0.21.1.tar.gz | head
drwxrwxr-x root/root         0 2014-08-05 08:09 libgit2-0.21.1/
-rw-rw-r-- root/root      1169 2014-08-05 08:09 libgit2-0.21.1/.HEADER
-rw-rw-r-- root/root        22 2014-08-05 08:09 libgit2-0.21.1/.gitattributes
-rw-rw-r-- root/root       321 2014-08-05 08:09 libgit2-0.21.1/.gitignore
-rw-rw-r-- root/root      1246 2014-08-05 08:09 libgit2-0.21.1/.mailmap

이에 대한 해결책이 있지만 분명히 이것이 최선의 해결책은 아닙니다. 또한 상단에 여러 디렉터리가 있는지 확인해야 합니다.

mkdir libgit2 && tar xvf v0.21.1.tar.gz -C libgit2 --strip-components 1

답변1

tarball을 명령줄 인수로 사용하여 다음 스크립트를 실행합니다.

#!/bin/bash

DIR=$(tar tvf ${1} | egrep -o "[^ ]+/$")

if [ $(echo ${DIR} | egrep -o " " | wc -l) -eq 0 ]; then
    echo ${DIR};
else
    echo "ERROR: multiple directories in tarball base"
    exit 1
fi

답변2

고쳐 쓰다죄송합니다. 최상위 디렉토리의 이름도 원한다는 사실을 잊어버렸습니다. "else"를 포함하도록 명령을 업데이트했습니다. 디렉토리가 하나만 발견되면 해당 이름이 표시됩니다. "ERROR"가 발생하면 "test.file"의 내용을 보고 tar의 디렉터리를 볼 수 있습니다.

이 시도:

$ zcat test.tar.gz | tar xvf - | \
    awk -F/ '{print $1}' | \
    uniq > test.file && \
    if (($(wc -l 'test.file' | \
    awk '{print $1}')>1));then echo "ERROR";else cat test.file;fi

맨즈캣

zcat은 gunzip -c와 동일합니다. (일부 시스템에서는 압축할 원래 링크를 유지하기 위해 zcat을 gzcat로 설치할 수 있습니다.) zcat는 명령줄이나 표준 입력에서 파일 목록의 압축을 풀고 압축되지 않은 데이터를 표준 출력에 씁니다. zcat은 .gz 접미사가 있는지 여부에 관계없이 올바른 매직 번호로 파일의 압축을 풉니다.

awk -F/ '{인쇄 $1} |

"/"로 표시된 첫 번째 고유 단어를 인쇄합니다.

> 테스트 파일

파일에 출력 쓰기

(($(wc -l 'test.file' | awk '{print $1}')>1))

이중 ((..)) 구조를 사용하면 산술 확장 및 평가가 가능합니다. wc -l파일의 줄 수를 가져옵니다. awk '{print $1}')>1행 개수인 첫 번째 열만 가져오고 해당 숫자가 1보다 큰지 확인합니다. then echo "ERROR"tar 파일에서 여러 디렉터리가 발견되면 "오류"가 인쇄됩니다.

도움이 되길 바랍니다.

관련 정보