압축을 풀지 않고 tar.gz 파일에서 파일을 검색하고 결과를 다른 폴더에 복사합니다.

압축을 풀지 않고 tar.gz 파일에서 파일을 검색하고 결과를 다른 폴더에 복사합니다.

압축을 풀지 않고 파일 내에서 파일을 검색해야 합니다 tar.gz. 그런 다음 검색된 파일(있는 경우)을 다른 폴더에 복사해야 합니다.

지금까지 이것을 가지고 있지만 줄의 복사 부분에서 오류가 발생합니다.

gunzip -c file.tar.gz | tar tvf - | grep filename | -exec cp {} /folder/another_folder \;

아니면 압축을 풀지 않고 파일 내에서 파일을 검색하는 더 좋은 방법이 있습니까 tar.gz?

답변1

귀하의 버전이 tar전환을 지원 하지 않습니까 -z?

$ tar ztvf file.tar.gz | grep fliename

아카이브에 파일이 있는 경우 파일 이름이 반환됩니다.

파일 추출 중

파일을 먼저 검색하고 파일이 있는 경우에만 추출하려면 다음과 같이 하면 됩니다.

$ arc="<tarball>"; file="<file to extract>"; \
        tar ztvf $arc | grep $file && tar zxvf $arc $file

샘플 압축 패키지

$ tar ztvf ffmpeg.static.64bit.2013-10-05.tar.gz 
-rwxr-xr-x root/root  19579304 2013-10-05 00:06 ffmpeg
-rwxr-xr-x root/root  19528712 2013-10-05 00:06 ffprobe

$ arc="ffmpeg.static.64bit.2013-10-05.tar.gz"; file="ffmpeg"; \
       tar ztvf $arc | grep $file && tar zxvf $arc $file

-rwxr-xr-x root/root  19579304 2013-10-05 00:06 ffmpeg
ffmpeg

확인하다

$ ll ffmpeg
-rwxr-xr-x 1 manny manny 19579304 Oct  5 00:06 ffmpeg*

다른 디렉토리

추출된 파일을 다른 위치로 출력하려면 스위치를 사용하면 tar됩니다 -C.

$ arc="<tarball>"; file="<file to extract>"; \
        tar ztvf $arc | grep $file && tar zxvf $arc -C /path/to/dir $file

예시 #1

$ arc="ffmpeg.static.64bit.2013-10-05.tar.gz"; \
       file="ffmpeg"; tar ztvf $arc | grep $file && tar zxvf $arc -C /tmp $file

확인하다

$ ll /tmp/ffmpeg
-rwxr-xr-x 1 manny manny 19579304 Oct  5 00:06 /tmp/ffmpeg*

예시 #2

$ arc=cp210x.tar.gz; file="cp210x/usb-serial/Makefile"; \
       tar ztvf $arc | grep $file && tar zxvf $arc -C /tmp $file

확인하다

$ ll /tmp/cp210x/usb-serial/Makefile 
-rw-rw-r-- 1 manny manny 388 May 13 01:37 /tmp/cp210x/usb-serial/Makefile

예시 #3

파일 패턴을 추출하려는 경우 와일드카드를 사용할 수도 있습니다.

$ arc=cp210x.tar.gz; file='*Makefile'; \
       tar ztvf $arc | grep -E "$file" && tar zxvf $arc -C /tmp --wildcards "$file"

확인하다

$ find /tmp/cp210x -ls | grep Makefile
26881948    4 -r--r--r--   1 manny    manny         171 Mar 14  2012 /tmp/cp210x/Linux_3.x.x_VCP_Driver_Source/Makefile
26881960    4 -rw-rw-r--   1 manny    manny         388 May 13 01:37 /tmp/cp210x/usb-serial/Makefile

세부 사항

위 내용에는 몇 가지 추가 변경 사항이 포함됩니다. 일치하는 모든 콘텐츠를 추출하는 중입니다 '*Makefile'. 이제 이를 작은따옴표와 큰따옴표로 묶습니다. 이는 *Makefile우발적인 확장을 방지하기 위한 것입니다.

grep-E이제 출력에서 ​​단일 문자열이 아닌 정규식을 검색하므로 스위치가 포함됩니다 tar. 또한 매개변수를 grep큰따옴표로 묶어서는 안 됩니다.

--wildcardstar이제 개별 파일이 아닌 패턴을 기반으로 추출할 수 있도록 두 번째 스위치를 사용합니다 . 이제 이 매개변수를 보호하기 위해 큰따옴표로 묶습니다.

답변2

한 번에 이 작업을 수행할 수는 없습니다. 아카이브 위치가 아닌 다른 위치에 아카이브의 일부를 (쉽게) 추출할 수 없습니다. 다음을 수행할 수 있습니다.

pattern=filename
file_path="$(tar tzf file.tar.gz 2>/dev/null| grep "$pattern")"
if [ ! -n "$file_path ];then
    tar xvzf file.tar.gz "$file_path"
    cp "$file_path" /new/location
else
    echo "No files matching $pattern found in archive"
fi

이제 위의 "쉬운" 단어에 대해 이야기해 보겠습니다. GNU 구현에는 추출하기 전에 파일 이름에서 숫자를 가져와서 많은 구성 요소를 제거하는 옵션이 tar있습니다 . --strip-components따라서 기본 이름 앞에 구성 요소 수를 계산하여 일종의 "여기서 추출" 작업을 수행한 다음 복사할 수 있습니다.

pattern=filename
file_path="$(tar tzf file.tar.gz | grep "$pattern" )"
file_name="$(basename "$file_path")"
[ -z "$file_path" ] && echo "No files matching $pattern found." && exit 1
components=0
while [ "$file_path" != '/' ];do
    file_path=$(dirname "$file_path")
    components=$((components+1))
done
tar xvzf file.tar.gz --strip-components "$components" "$file_path" && cp "$file_name" /new/location

답변3

tar.gz 파일을 추출하지 않고 검색해야 합니다. 그런 다음 검색된 파일(있는 경우)을 다른 폴더에 복사해야 합니다.

지금까지 이것을 가지고 있지만 줄의 복사 부분에서 오류가 발생합니다.

gunzip -c file.tar.gz | tar tvf - | grep filename | -exec cp {} /folder/another_folder \;

아니면 압축을 풀지 않고 tar.gz 파일에서 파일을 검색하는 더 좋은 방법이 있습니까?

tarball을 직접 검색하기 위한 grep 호환 유틸리티는 다음과 같습니다.우그레프옵션이 있습니다 -z:

-z, --decompress
        Decompress files to search, when compressed.  Archives (.cpio,
        .pax, .tar, and .zip) and compressed archives (e.g. .taz, .tgz,
        .tpz, .tbz, .tbz2, .tb2, .tz2, .tlz, and .txz) are searched and
        matching pathnames of files in archives are output in braces.  If
        -g, -O, -M, or -t is specified, searches files within archives
        whose name matches globs, matches file name extensions, matches
        file signature magic bytes, or matches file types, respectively.
        Supported compression formats: gzip (.gz), compress (.Z), zip,
        bzip2 (requires suffix .bz, .bz2, .bzip2, .tbz, .tbz2, .tb2, .tz2),
        lzma and xz (requires suffix .lzma, .tlz, .xz, .txz).

일치하는 파일을 검색하려면 다음 명령 하나만 pattern필요합니다 file.tar.gz.

ugrep -z -l "pattern" file.tar.gz

패턴과 일치하는 파일을 추출하려면 옵션과 함께 ugrep을 사용하여 -z아카이브 에 일치하는 파일을 나열하고 다음 위치로 추출할 수 -l있습니다 .--format="%s "folder/another_folder

tar xzf file.tar.gz `ugrep -z -l "pattern" --format="%z " file.tar.gz` -C folder/another_folder

관련 정보