나는 GNU tar -h
(일명 )의 작동 --dereference
방식을 알고 있다고 생각했는데 지금은 혼란스럽습니다.
고려하다:
$ tree dir/
dir/
├── file
└── link -> file
1 directory, 2 files
이것을 tar 명령에 추가하면 -h
두 개의 파일 항목이 있는 아카이브를 얻어야 합니까? 하나는 name file
이고 다른 하나는 name 이고 link
각각 동일한 내용을 가지고 있습니까? 대신 file
예상대로 아카이브했지만 아카이브의 심볼릭 링크 항목은 link
다음을 가리킵니다 file
.
$ tar cf archive -h dir
$ tar tvf archive
drwxr-xr-x bspencer/bspencer 0 2024-01-12 15:36 dir/
-rw-r--r-- bspencer/bspencer 13 2024-01-12 15:41 dir/file
hrw-r--r-- bspencer/bspencer 0 2024-01-12 15:41 dir/link link to dir/file
-h
이 옵션은 아카이브에 심볼릭 링크 항목이 생성되는 것을 방지하도록 되어 있지 않습니까 ?
$ man tar |grep -A1 -- --dereference
-h, --dereference
Follow symlinks; archive and dump the files they point to.
전통적인 문자 대신 --dereference
사용하는 경우를 포함하여 매개 변수에 긴 이름을 사용하면 동일한 결과를 얻습니다 .--create
$ tar --version |head -1
tar (GNU tar) 1.34
답변1
다음 출력에도 불구하고 Tar는 링크가 아닌 개별 파일을 포함하도록 이러한 아카이브를 올바르게 확장합니다 tar tvf
.
$ tree dir
dir
├── file
└── link -> file
1 directory, 2 files
$ tar cf archive -h dir
$ tar tvf archive
drwxr-xr-x bspencer/bspencer 0 2024-01-16 12:26 dir/
-rw-r--r-- bspencer/bspencer 9 2024-01-16 12:26 dir/file
hrw-r--r-- bspencer/bspencer 0 2024-01-16 12:26 dir/link link to dir/file
$ mkdir out
$ cd out && tar xvf ../archive
dir/
dir/file
dir/link
$ tree
.
└── dir
├── file
└── link
2 directories, 2 files
$ ls -l dir
total 8
-rw-r--r-- 2 bspencer bspencer 9 Jan 16 12:26 file
-rw-r--r-- 2 bspencer bspencer 9 Jan 16 12:26 link
따라서 tar는 잘 작동합니다.
나는 이것이 tar tvf
아카이브의 내용을 확실하게 보여줄 것이라고 잘못 생각했습니다. 대신 아카이브가 실제 개별 파일을 포함하도록 확장되더라도 "링크됨"으로 표시됩니다.
그런데, tar tvf
출력이 링크에 대해 말하는 이유에 대한 제 생각에는 tar가 공간을 절약하기 위해 파일 내용을 링크로 저장하고 확장 시 별도의 파일로 생성되는 것으로 표시한다는 것입니다. 그러나 어떤 이유로 인해 tar tvf
이는 표시되지 않고 실제 내부 저장소만 표시됩니다.