새로운 정보에 비추어 질문을 다시 표현했습니다. 이전 정보는이를 기반으로 한 답변과 의견을 무효화하지 않기 위해 아래에 있습니다.
현재 작업중인 디렉토리와 다른 디렉토리 tarball.tar
에 압축을 풀고 싶은 tarball이 있으므로 원하는 destination
작업을 수행하는 tar의 -C
옵션을 사용 합니다.
그러나 tarball에서 추출 할 파일을 지정하려고하면 -C
옵션이 무시되는 것처럼 보입니다. 파일은 내 현재 작업 디렉토리에서 추출됩니다.
tar -xf tarball.tar -C destination
Tar의 버전은
$ tar --version
tar (GNU tar) 1.28
이것은 버그입니까, 아니면 제가 -C
잘못 이해하고 있습니까?
다음은 동작을 보여주는 bash 스크립트입니다. 빈 디렉토리에 저장 (또는 실행)
#!/bin/bash -x
set -e # Abort if any of these commands fails
touch file1 file2 file3 # Create files to be archived
tar -cf tarball.tar file1 file2 file3 # Create the archive
rm file1 file2 file3 # Remove source files
tar -tf tarball.tar # Should contain files 1–3
mkdir -p destination # Create destination directory
tar -xf tarball.tar file1 file2 -C destination # Extract two files from
#+ tarball into destination directory
ls . # Should contain only the script itself,
#+ tarball.tar, and destination
ls destination # Should contain file1 and file 2
내가 스크립트를 실행하면 destination
빈이고 ls .
반환
$ ls .
file1 file2 tarball.tar tar.sh
추출 할 파일을 지정하지 않으면 ( tar -xf tarball.tar file1 file2 -C destination
9 행이 tar -xf tarball -C destination
) 예상대로 동작합니다. ls destination
쇼 file1 file2 file3
.
나는 tar 아카이브있어 /path/to/backup.tar.gz
다른 사람, 디렉토리 사이에, 포함 home/bleistift2/stuff
및 home/bleistift2/more_stuff
.
이 두 디렉토리를 /home/bleistift2/tmp
(아카이브가 아닌 파일 시스템에서) 추출하기 위해 다음 명령을 실행합니다. 내 이해는 -C
추출 위치 를 지정하는 것입니다. 대상 디렉토리가 있습니다.
tar -zxvf /path/to/backup.tar.gz \ # The archive to extract
home/bleistift2/stuff home/bleistift2/more_stuff \ # The contents to extract
--same-owner -C /home/bleistift2/tmp # The destination directory
그러나 디렉토리는 아카이브의 형제로 저장되므로 /path/to/home/bleistift2/{stuff, more_stuff}
대신 /home/bleistift2/tmp/home/bleistift2/{stuff, more_stuff}
.
-C
말 그대로 다음과 같이 작동합니다 cd
.
$ tar -tf test.tar
a
b
$ ls -Al dst1/
total 0
$ ls -Al dst2/
total 0
$ tar -xvf test.tar -C dst1/ a -C ../dst2/ b
a
b
$ rm -v dst*/*
removed 'dst1/a'
removed 'dst2/b'
$ (TAR=$(realpath test.tar); cd dst1/; tar -xvf "$TAR" a; cd ../dst2/; tar -xvf "$TAR" b)
a
b
$ rm -v dst*/*
removed 'dst1/a'
removed 'dst2/b'
$
네, 주문이 중요합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다