큰 타르볼에서 특정 수의 파일 만 풀기


12

원격 시스템에서 로컬 시스템으로 FTP를 전송하는 데 바쁜 큰 타르볼이 있습니다.

untarring을 시작할 수 있는지 한 번에 한 번에 50 개의 파일을 말하여 전송하는 동안 해당 파일이 처리되기 시작할 수 있는지 알고 싶습니다.

답변:


12

다음 은 아카이브에서 특정 파일을 추출하는 방법에 대한 자세한 설명입니다. 특히 GNU tar는 tarball에서 하나 이상의 파일을 추출하는 데 사용할 수 있습니다. 특정 아카이브 멤버를 추출하려면 정확한 멤버 이름을 인수로 제공하십시오.

예를 들면 다음과 같습니다.

tar --extract --file={tarball.tar} {file}

특정 글 로빙 패턴 (와일드 카드)과 일치하는 파일을 추출 할 수도 있습니다. 예를 들어, cbz.tar에서 디렉토리 접두사와 상관없이 pic로 시작하는 모든 파일을 추출하려면 다음을 입력하십시오.

tar -xf cbz.tar --wildcards --no-anchored 'pic*'

모든 PHP 파일을 추출하려면 다음을 입력하십시오.

tar -xf cbz.tar --wildcards --no-anchored '*.php'

어디,

-x: tar가 파일을 추출하도록 지시합니다.
-f: 파일 이름 / 타르볼 이름을 지정합니다.
-v: 상세 (파일을 추출하는 동안 진행률 표시)
-j: bzip2를 통해 아카이브를 필터링하고 .bz2 파일을 압축 해제하는 데 사용합니다.
-z: gzip을 통해 아카이브를 필터링하고 .gz 파일을 압축 해제하는 데 사용합니다.
--wildcards: tar에게 명령 행 인수를 globbing 패턴으로 취급하도록 지시합니다.
--no-anchored: / 구분 기호 다음에 멤버 이름에 패턴이 적용됨을 알려줍니다.


3
특정 파일을 추출하고 싶지 않습니다. 파일 이름이 무엇인지 모르기 때문에 처음 50 개의 파일을 추출하고 싶습니다.
피터 반 니에 르크

4
"tar -tf"를 사용하여 파일 이름 목록을 가져오고 "head"를 사용하여 처음 50 개를 가져온 다음 추출 할 파일 이름 목록으로 다른 tar 명령에 해당 목록을 제공하십시오. "tar -xf file.tar --no-anchored`tar -tf file.tar | head -50`"
Simon Hibbs

내 테스트에서 부분적으로 trandferred 50 번째 파일을 추출하는 것이 가능합니다 -t. tarball이 완전히 다운로드 될 때까지 목록 에서 (현재) 마지막 파일을 추출하지 않는 것이 좋습니다 . 어느 시점에서나, 목록에는 전송되었거나 전송중인 파일 이름 만 표시됩니다. 전체 목록이 아닙니다 . 완전히 다운로드 될 때까지
Peter.O

2

이것을 직접 시도하지는 않았지만 어떻습니까?

tar xvf archive.tar | head -n50

Tar은 추출 된 각 파일에 대해 STDOUT에 행을 출력 한 다음 head50 행 후에 파이프를 종료합니다. 파이프가 죽으면 타르도 죽을 것으로 예상됩니다.


죄송합니다 head. 물론이었습니다 . 대답을 바꾸겠습니다.
jippie

확인하지는 않았지만 파이프 버퍼로 인해 tarSIGPIPEd 이전에 50 개 이상의 파일을 추출 할 수 있으며 특히 마지막의 불완전한 파일을 추출 할 수 있습니다.
Gilles 'SO- 악한 중지'

2
tar -tvf tarfile.tar

당신에게 전체 파일 목록을 제공합니다 tarfile.tar

tar -xvf tarfile.tar fileToRestore  

이 명령은 fileToRestore

여러 파일의 압축을 풀지 만 모든 파일을 압축 해제하려면

  • 모든 파일 목록 tarfile.tartar.txt

    tar -tvf tarfile.tar > tar.txt
    
  • 이제 tar.txt전체 파일 목록이 포함되어 tarfile.tar 있으며 복원하려는 파일 또는 헤드 만 남길 수 있습니다 ...

    head -n50 tar.txt > tar2.txt
    

이 줄을 파일에 넣을 수 있습니다

cat tar.txt|while read line
do
   tar -xvf tarfile.tar ${line}
done

또는 완전한 스크립트 파일 :

#!/bin/bash

if [[ "$1" = "" || "$2" = "" ]]
   then
   echo ""
   echo "Uso: untar-list.sh tarfile.tar listfile.txt"
   echo ""
   exit 1
fi

tarfile=$1
file=$2

if [[ ! -f ${tarfile} ]]
   then
   echo ""
   echo "Archivo ${tarfile} no existe"
   echo ""
   exit 1
fi

if [[ ! -f ${file} ]]
   then
   echo ""
   echo "Archivo ${file} no existe"
   echo ""
   exit 1
fi

cat ${file}|while read line
do
  tar -xvf ${tarfile} ${line}
done

echo ""
echo "Finalizado"
echo ""

그리고 그게 다야


2
루프에서 tar 명령을 호출하는 것은 고통스럽게 느려 야합니다. 매번 전체 파일을 읽습니다.
swdev
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.