파일 이름은 다음과 같지만 디렉터리는 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 파일에서 여러 디렉터리가 발견되면 "오류"가 인쇄됩니다.
도움이 되길 바랍니다.