![tar를 만들 때 파일을 하위 디렉터리에 넣습니다.](https://linux55.com/image/86530/tar%EB%A5%BC%20%EB%A7%8C%EB%93%A4%20%EB%95%8C%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%ED%95%98%EC%9C%84%20%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC%EC%97%90%20%EB%84%A3%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
tar 파일을 만들려고 합니다. tarred가 필요한 폴더가 2개 있습니다. 내 질문을 명확히하겠습니다.
folder 1. /temp1
folder 2. /temp1
이제 내 tar 출력이 다음과 같기를 원합니다. 압축을 풀면 다음과 같은 결과가 나옵니다.
/temp1/* (stuff of temp1)
/temp1/temp2/* (temp2 and subdirectories inside temp1).
이제 temp2를 temp1에 복사한 다음 압축합니다. 누군가 내가 이러한 내용을 복사할 필요가 없는 방식으로 이를 수행하도록 제안할 수 있습니까? 마치 중간에 프로세스를 종료하는 것처럼 temp2의 일부 내용을 temp1에 남겨 둘 것입니다.
답변1
temp2를 temp1에 Symlink로 연결하고 tar에게 -h
or 옵션을 사용하여 --dereference
심볼릭 링크를 역참조(따르기)하도록 지시합니다.
예를 들어
cd temp1
ln -s ../temp2/ .
cd ..
tar cvz -h -f example.tar.gz ./temp1
rm -f temp1/temp2
그러면 디렉토리 (예 : ) ./temp2
아래에 tar 아카이브가 생성 됩니다../temp1
./temp1/temp2
-h
이 옵션이 GNU 확장인지 기억이 나지 않습니다 . GNU를 사용하지 않는 경우 tar
사용하기 전에 주의 깊게 테스트하십시오.
temp1의 수정 타임스탬프에 관심이 있는 경우 다음을 사용하세요 touch -r
.
touch -r temp1 temp1-modtime
cd temp1
ln -s ../temp2/ .
cd ..
touch -r temp1-modtime temp1
tar cvz -h -f example.tar.gz ./temp1
rm -f temp1/temp2
touch -r temp1-modtime temp1
rm -f temp1-modtime
답변2
sed가 경로 이름을 아카이브로 처리하는 동안 찾아서 바꾸는 tar의 변환 옵션을 사용하여 이 작업을 수행할 수 있습니다.
내 생각에 당신이 원하는 것은 다음과 같습니다.
tar -cf output.tar --transform 's,^temp2,temp1/temp2,' temp1 temp2
이는 로 시작하는 모든 경로와 일치 temp2
하고 로 다시 작성 됩니다 temp1/temp2
. 로 시작하는 모든 경로는 일치하지 않으므로 수정되지 않습니다 temp1
.
답변3
몇 가지 요령으로 tar 확장을 사용하십시오. 이 같은?
$ mkdir temp3; mkdir temp3/temp1 # create another, empty temp1 dir
$ ln temp2 temp3/temp1/temp2 # link temp2 into fake temp1
그런 다음...
$ tar cf example.tar temp1 # 1st part of archive without temp2
$ cd temp3
$ tar rf ../example.tar temp1 # append temp2 as subfolder of temp1 to archive
하드 링크를 사용하면 임시 디렉토리의 기호 링크가 여전히 기호 링크로 처리될 수 있습니다. 따라서 -h가 필요하지 않습니다. 아마도 그것은 미래에 당신을 문제로부터 보호해 줄 것입니다.
--transform과 같은 추가 명령과 함께 GNU tar 확장을 볼 수도 있습니다. 또한보십시오:http://www.linuxquestions.org/questions/linux-newbie-8/tar-subdirectory-question-821074/